Thread vs java.util.concurrency

0

Obiło mi się o uszy że tworzenie "wątków" przy pomocy Thread jest już przestarzałe i nie powinno się tak robić. Zamiast tego powinno się używać zadań wykonywanych prze Executory dostępne w pakiecie java.util.concurrency. Co wy o tym myślicie?

Co w przypadku gdy mamy jakiś serwer który przyjmuje połączenia i chcemy aby były obsługiwane asynchronicznie w osobnych wątkach? Mamy pisać niekończące sie zadania dla każdego połączenia albo zadania wykonywane co milisekunde? Czy w tego typu przypadkach jednak korzystamy po prostu z Thread?

Kiedy używać narzędzi z pakietu concurrency?

0

Zaraz, na 1 rzut oka wydaje mi się że chyba nie do końca wiesz czym różni się Runnable od Thread i jak działają pule wątków. Gdy Thread skończył "obsługiwać" jednego taska, będzie obsługiwał innego :) Np. mamy 3 Runnable i ExecutorService z 1 wątkiem to ten executor pokolei wykona 3 - jak w załącznikach :)

0

tak, ale co używać w takich przypadkach? :P

0

To zależy w jakich dokładnie przypadkach.
Jeśli twój serwis głównie obrabia IO i niewiele oblicza (czyli typowo) - to
może nie potrzebujesz wątków wcale i możesz pojechać na non blocking? Zobacz jak to robi Ratpack/ Netty.

0
Brunatny Samiec napisał(a):

tak, ale co używać w takich przypadkach? :P

Jeśli to tylko możliwe lepiej korzystac z java.util.concurrency niż klasy Thread bezpośrednio

0
Brunatny Samiec napisał(a):

Co w przypadku gdy mamy jakiś serwer który przyjmuje połączenia i chcemy aby były obsługiwane asynchronicznie w osobnych wątkach?

Serwer www już dobrze rozdziela zadania między wątki. Musisz sobie najpierw zadać pytanie, dlaczego nie chcesz obsługiwać tych żądań normalnie. Jak podasz tą odpowiedź, to łatwiej będzie zaproponować rozwiązanie.

Generalnie - pula wątków i executor. Na przykład springowy.

0
Brunatny Samiec napisał(a):

Co w przypadku gdy mamy jakiś serwer który przyjmuje połączenia i chcemy aby były obsługiwane asynchronicznie w osobnych wątkach? Mamy pisać niekończące sie zadania dla każdego połączenia albo zadania wykonywane co milisekunde? Czy w tego typu przypadkach jednak korzystamy po prostu z Thread?

Typowy serwer (np Tomcat) ma niewielką pulę wątków (potencjalnie jeden wątek) które akceptują nowe połączenia.

Te nowo stworzone sockety reprezentujące konkretne połączenia są później przekazywane do puli wątków client pollera który wykorzystując mechanizm NIO (Select) nieblokująco zbiera sobie dane z wszystkich obsługiwanych przez niego socketów, dokąd nie zbierze sobie odpowiednio dużo danych (np serwery servletów czekają tylko na zakończenie sekcji nagłówków).

Później takie dane są składane w jakąś strukturę danych i wraz ze strumieniem danych odpowiedzialnym za dalsze dane dochodzące do serwera przekazuje je na pulę wątków workerów.

Klasycznie taki jeden request zajmuje sobie ten wątek aż do wysłania odpowiedzi.

Polecam sobie przeglądnać javadoc do ThreadPoolExecutora, on pokazuje co oferuje ponad takim klasycznym walnięciem wątku: https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/ThreadPoolExecutor.html - przede wszystkim pokazuje że pula to nie tylko wątki ale też kolejka zadań.

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