Un thread pool "bounded" (limitato) in cui ci sono al massimo N thread ha tutta una serie di vantaggi.Originariamente inviato da mainetz
1) Quindi diciamo che ha senso usare una thread pool quando ho molti thread da eseguire e per evitare il problema di eseguirli tutti insieme ne lancio a gruppetti. Giusto??
Prendiamo il caso di non utilizzo di un thread-pool. Ipotizza un web-server in cui per ogni nuova connessione ricevuta viene semplicemente e banalmente creato un nuovo thread in cui gestire la connessione. In pratica si ha 1 thread per 1 task.
Finché le richieste in contemporanea non sono elevate può andare bene. Ma che succederebbe se il server fosse molto caricato, sia per puro "caso" sia per volonta "maligna"??
Creare un numero potenzialmente illimitato di thread può dare dei problemi:
a) La creazione di ogni nuovo thread richiede un certo tempo e risorse da parte sia del S.O. che della JVM.
b) Avere moltissimi thread consuma sicuramente molte risorse, principalmente memoria ma anche altre risorse (file, socket, ecc...).
c) Per via dei motivi sopra detti, un numero elevato di thread può anche compromettere la sicurezza e la stabilità del sistema. Se molti thread consumano molta memoria potrebbe succedere che la JVM esaurisca la memoria, lanciando un OutOfMemoryError. In quel caso ... beh, c'è ben poco da sperare!
Usando un thread-pool "bounded" (limitato) ci sono al massimo N thread e sopratutto sono già creati. Quando un nuovo task deve essere eseguito, non deve essere creato un nuovo thread (solo se per caso un thread "muore" il thread-pool lo rimpiazza con uno nuovo). Il task viene messo in coda e appena un thread si libera, prende il prossimo task e lo esegue.