Problem z zapętleniem.

0

Witam,

Pisze z pewnym problemem a mianowicie tworze prosty serwer w Javie i nie wiem jak zrobić aby cały czas sprawdzane było czy są wiadomosci.

Gdy przychodzi wiadomość dodaje się ona do ArrayList wiadomosciContainer. Następnie do zmiennej waitToRespond jest dodawane 1 (czyli jedna wiadomość oczekuje na odpowiedz).
I teraz jeżeli waitToRespond > 0 to odpowiedz,

while(waitToRespond > 0 && enableTimer == true){
	delaySendNews = new Timer();                               //Tutaj uruchamiam timer 
	delaySendNews.schedule(new sendNewsToClients(), 1000 );  //który opóźnia odpowiedź
	waitToRespond--;
	enableTimer = false;
}

po sekundzie chce aby ta funkcja została wykonana,

class sendNewsToClients extends TimerTask{
	public void run() {	
		delaySendSocket.cancel();
		ChatServerConnection.this.server.writeToAll(wiadomosciContainer.get(0));
		wiadomosciContainer.remove(0);
		enableTimer = true;
	}
}

i w tym problem że nie wiem jak to zapętlić, bo to tylko raz się wykonuje a jak przychodzą kolejne wiadomości, nic ;/.

0

Primo: nie masz synchronizacji.
Secundo: W Javie 1.5 istnieje coś takiego jak interfejs BlockingQueue, jedna z jego implementacji to DelayQueue. Być może ta klasa udostępnia właśnie to czego chcesz. Jeśli nie, to i tak masz np ArrayBlockingQueue czy LinkedBlockingQueue które mają od razu synchronizowane metody.

0

Nie rozumie o jaką synchronizacje chodzi?

PS. zaraz coś poszukam o BlockingQueue

0

Co ty w ogóle chcesz zrobić tutaj?

A BlockingQueue jest w sumie dobrze opisane w JavaDocu z Javy 6: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html

0

Bo chce zrobić coś takiego że jeżeli w ciągu 1 sekundy przyjdzie 100 wiadomości to odpowiedz do każdej wysłana będzie co sekundę. Przez co setna wiadomość będzie czekać 100sekund.

(Takie jakby dawkowanie)

0

A jeśli wysyłanie pojedynczej wiadomości będzie trwało sekundę?

Ogólnie możesz zrobić tak, że jeden wątek odbiera wiadomości i kładzie je do BlockingQueue. Drugi wątek ma pętlę while(!isInterrupted()) w której robi take na tej kolejce. Ta metoda czeka, aż coś się pojawi w kolejce. Następnie robisz Thread.sleep(1000), a potem wysyłasz odpowiedź. Zakładam tutaj, że odstępy między zakończeniem wysyłania jednej odpowiedzi, a zaczęciem wysyłania następnej mają wynosić ok 1000 ms.

0

To gdy ona dojdzie i będzie np. 200 w kolejce czeka 200 sekund na wysłanie odpowiedzi przez serwer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1