Rozróżnianie wątków

Odpowiedz Nowy wątek
2016-05-07 19:47
głuchyaa
0

Witam, stworzyłem server obsługujący kilka wątków naraz i pojawił się u mnie problem z ich rozróżnieniem. Mianowicie do identyfikacji danego wątku mogę posłużyć się Thread.currentThread(). Wątki mam zapisane w tablicy threads, zatem mogę po kolei przechodzić tablicę i sprawdzać, czy danych wątek pokrywa się z Thread.currentThread(). Jednak wydaje mi się, że to nie jest zbyt dobre rozwiązanie, czy ktoś ma jakieś sugestie w jaki sposób można to zastąpić? A może jednak stosować tę metodę? Dodam, że jest to server obsługujący kilka wątków i muszę wyświetlać różne informację różnym klientom i dlatego potrzebuję je rozróżniać. Czy może istnieje jakiś inny sposób żeby robić to umyślnie?

Pozostało 580 znaków

2016-05-07 19:57
0

Może po prostu nadawaj im nazwy a potem wywałaj thread.getName ? :)

Pozostało 580 znaków

2016-05-07 20:28
głuchyaa
0

No ok, to w zasadzie też mogę używać Thread.currentThread().getId(). Zastanawia mnie jedna rzecz, weźmy przykładowo, że mam coś takiego:

os = new PrintStream(clientSocket.getOutputStream());
synchronized (this)
            {
                for (int i = 0; i < liczbawątków; i++)
                {
                    threads[i].os.println(Thread.currentThread().getId());
                }
            }

Wywołanie tego w run nie jest raczej dobrym pomysłem, bo zostanie wykonane przez każdy wątek. Celem oczywiście jest wyświetlenie każdemu klientowi jego numeru ID. I teraz pytanie, jak wykonywać takie operacje w run, ponieważ połączenie musi być z nimi nadal utrzymywane?

Pozostało 580 znaków

2016-05-08 13:06
głuchyaa
0

I jeszcze jedno pytanie - czy ktoś orientuje się w jaki sposób użyć listy, aby była ona ogólna dla wszystkich wątków? Mianowicie na przykład po usunięciu elementów w jednym wątku, w drugim też będą one usunięte?

Pozostało 580 znaków

2016-05-08 13:10
głuchyaa
0

Trochę czytałem o tym, na przykład o takim rozwiązaniu List<string> users = Collections.synchronizedList(new ArrayList<string>());, ale chciałbym poznań wasze zdanie, jaki sposób jest najlepszy.

Pozostało 580 znaków

2016-05-08 15:03
Świetny Orzeł
0
głuchyaa napisał(a):

Celem oczywiście jest wyświetlenie każdemu klientowi jego numeru ID. I teraz pytanie, jak wykonywać takie operacje w run, ponieważ połączenie musi być z nimi nadal utrzymywane?

Troszkę nie rozumiem co chcesz osiągnąć?
Chcesz utrzymywać jeden wątek per klient? Imo nie tędy droga.
Jeżeli planujesz coś większego to ilością wątków zagłodzisz system.
Nie lepiej by było użyć thread pool i zwalniać wątki zamiast trzymać zajęte per klient?
Opisz proszę dokładniej jakie masz wymagania.

czytałem o tym, na przykład o takim rozwiązaniu List<string> users = Collections.synchronizedList(new ArrayList<string>());,

Jeżeli to ma być lista w której zarejestruje się każdy aktywny wątek, to polecił bym CopyOnWriteArrayList.
modyfikacje są kosztowniejsze, ale za to nie ma narzutu na synchronizację przy odczycie.

Pozostało 580 znaków

2016-05-08 15:43
głuchyaa
0
Świetny Orzeł napisał(a):

Troszkę nie rozumiem co chcesz osiągnąć?
Chcesz utrzymywać jeden wątek per klient? Imo nie tędy droga.
Jeżeli planujesz coś większego to ilością wątków zagłodzisz system.
Nie lepiej by było użyć thread pool i zwalniać wątki zamiast trzymać zajęte per klient?
Opisz proszę dokładniej jakie masz wymagania.

Server ma implementować prostą grę, opierającą się na wysyłaniu komunikatów z servera do klienta i vice versa, która rusza po dodaniu 9 klientów, zatem maksymalnie trzeba obsłużyć 9 wątków. I właśnie brałem pod uwagę, tak jak wspomniałeś utrzymywanie jednego wątku per klient. Czy jednak lepiej sprawdzi się wspomniana przez Ciebie metoda?

Pozostało 580 znaków

2016-05-08 16:03
0

Dla tak małej ilości klientów nie masz co obawiać się zagłodzenia i nie ma znaczenia czy sobie stworzysz pule wątków o ograniczonym limicie czy nawet nie będziesz tego kontrolował. Co innego gdybyś pisał coś wysoce skalowalnego.

Pozostało 580 znaków

2016-05-08 16:33
głuchyaa
0
margor90 napisał(a):

Dla tak małej ilości klientów nie masz co obawiać się zagłodzenia i nie ma znaczenia czy sobie stworzysz pule wątków o ograniczonym limicie czy nawet nie będziesz tego kontrolował. Co innego gdybyś pisał coś wysoce skalowalnego.

Wtedy to już chyba najlepiej użyć NIO.

Świetny Orzeł napisał(a):

Jeżeli to ma być lista w której zarejestruje się każdy aktywny wątek, to polecił bym CopyOnWriteArrayList.
modyfikacje są kosztowniejsze, ale za to nie ma narzutu na synchronizację przy odczycie.

Ogólnie mam trochę z tym problem, zastanawiam się w jaki sposób umieszczać zasoby, które mają być modyfikowane przez wątki i te zmiany mają być przez nie widoczne. Mianowicie każdy wątek tworzy sobie od nowa dany element, w tym przypadku posłużmy się tablicą, czy tak jak wspomnieliśmy CopyOnWriteArrayList i od nowa wykonuje na niej operacje. Mamy na przykład metodę, która przyjmuje jako argument ilość potasowanych kart, które zwraca. Po zwróceniu usuwa karty, które zostały rozdane. Dajmy na to naszym argumentem jest liczba 3. Jeden wątek powinien pobrać 3 z 52 potasowanych kart, a następny już 3 z 49, aby te same karty nie zostały rozdawane. Jednak wątki tworzą od nowa listę i wybierają z 52, zatem dochodzi do sytuacji w które karty są powtarzane u klientów.

Pozostało 580 znaków

2016-05-11 09:22
0
głuchyaa napisał(a):

Jednak wątki tworzą od nowa listę i wybierają z 52, zatem dochodzi do sytuacji w które karty są powtarzane u klientów.

Najwyrazniej w zlym miejscu inicjalizujesz liste skoro jest na nowo inicjalizowana per watek. Zrob to raz i potem klientom udostepniaj tylko mozliwosc pobierania kart.

Pozostało 580 znaków

2016-05-11 18:00
głuchyaa
0

Mam dwie klasy, jedną z wątkiem, drugą z serverem. Czy dobrym sposobem jest zdefiniowanie ArrayList w klasie z serverem i przesłanie jej jako argumentu w konstruktorze domyślnym wątku, w momencie powoływania go do życia? Wtedy każdy z wątków otrzymałby tę samą tablicę. Tylko zastanawiam się w jaki sposób później operować na oryginale w run(), oczywiście o ile mój sposób jest ok. No chyba, że ktoś ma lepszy pomysł jak sobie poradzić z problemem opisanym w tym temacie?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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