Wiele klientów, wiele wątków a jedna lista

0

Witam.
Tworzę program o strukturze client <-> server z możliwością podpięcia wielu klientów do tego samego serwera.

Plan jest taki, że każdy klient jest obsługiwany przez jeden wątek serwer'a który odbiera do niego pakiety danych, a następnie wywołuje event mający na celu odpowiednie obsłużenie pakietu.

  1. Przychodzi pakiet od klienta do wątku serwera
  2. Pakiet jest deserializowany
  3. Utworzony zostaje obiekt dziedziczący po event wypełniony danymi z pakietu
  4. Event jest dodawany do listy "event's to perform" (lista wspólna dla wszystkich wątków)
  5. Wątek odpowiedzialny za wykonywanie eventów gdy tylko jest wolny pobiera następny event z listy i go obsługuje
    I teraz tak: Nie mam zbyt dużego doświadczenia jeśli idzie o wątki dlatego się was pytam, jak zrobić tą liste... dokładniej chodzi mi o to czego mam użyć na liście?
    Guarded, synchronization czy nic?

Oraz jak mam zrobić wątek odpowiedzialny za wykonywanie, dać go po prostu w nieskończoną pętle sprawdzającą czy list jest pusta, czy raczej tak: ?

while(true) {
    if(list.isEmpty()){
        try {
            wait();
        } catch (InterruptedException e) {}
    }else{
        //wykonanie eventu
    }
    
    //sprawdzanie czy przypadkiem serwer nie chce zakonczyc pracy = przerwanie petli
}

i teraz po dodaniu czegoś do listy wywoływane było by "notifyAll()"

Z góry dzięki za pomoc.

0

Gotowa implementacja synchronizowanej kolejki to właśnie to, czego potrzebujesz. Ale brawa za próbę - tak też można, tylko musisz synchronizować wszystkie operacje na kolejce i czekać z wszystkimi wątkami, które coś do niej wrzucają. To czekanie musiałoby się zakończyć sprawdzeniem, czy ich pytanie ma już odpowiedź, czy nie (jeśli nie, to dalej czekaj). Fajnie by było trzymać jakąś mapę/zbiór pytań i odpowiedzi, żeby każdy wątek mógł znaleźć to, co go interesuje. Z drugiej strony... Nie da się zrobić tego wielowątkowo? Każde połączenie trafia do oddzielnego wątku serwera i wszystkie wykonują się jednocześnie? Nie znam Twojego problemu, ale od czegoś inżynierowie dali nam wielowątkowe procesory.

0

Masz gotowe w API > http://docs.oracle.com/javase/tutorial/collections/implementations/queue.html

Do tego zamiast samemu zarządzać wątkami użyj Executora.

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