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ń.
Aisekaiscibi92