b'\n_START_ARTICLE_\nThread pool\n_START_SECTION_\nFunzionamento generale\n_START_PARAGRAPH_\nDurante la stesura di un programma \xc3\xa8 possibile, con diversi metodi, sottomettere dei task (o compiti) da eseguire al thread pool. Sar\xc3\xa0 compito del thread pool affidare il task ad un thread._NEWLINE__NEWLINE_Generalmente i thread pool sono dotati di una coda interna di task in attesa e di un certo numero di thread con cui eseguirli. A seconda dell\'implementazione del thread pool vengono utilizzate regole diverse per decidere quale task eseguire per primo, quanti thread attivi utilizzare e quanti thread lasciare in attesa quando la coda dei task \xc3\xa8 vuota._NEWLINE_Un concetto ricorrente nei thread pool \xc3\xa8 il riutilizzo dei thread: un thread viene usato pi\xc3\xb9 volte per diversi task durante il suo ciclo di vita. Questo diminuisce l\'overhead dovuto alla creazione dei thread e incrementa le prestazioni del programma che sfrutta il thread pool. Il riutilizzo dei thread non \xc3\xa8 una regola, ma \xc3\xa8 uno dei principali motivi che portano un programmatore a utilizzare un thread pool nei suoi applicativi.\n_START_SECTION_\nVantaggi\n_START_PARAGRAPH_\nUtilizzare un thread pool nativo o implementato in una particolare architettura comporta un incremento di prestazioni da parte delle applicazioni che lo sfruttano: i thread pool ottimizzano l\'utilizzo della memoria e del processore, diminuendo l\'overhead di gestione dei thread. \xc3\x88 possibile comunque adeguare il thread pool alle proprie esigenze, nel caso i parametri standard non siano soddisfacenti. Oltretutto la parallelizzazione di alcune operazioni porta ad un\'ottimizzazione delle risorse e ad un incremento di velocit\xc3\xa0 nello svolgimento dei compiti, anche se introduce altri tipi di problemi come l\'accesso esclusivo a risorse condivise (problema di race condition)._NEWLINE__NEWLINE_Un thread pool permette di snellire il codice ed evitare di preoccuparsi della creazione e della terminazione dei thread, in special modo quando non se ne conosce la quantit\xc3\xa0.\n_START_SECTION_\nArchitetture che utilizzano i thread pool\n_START_PARAGRAPH_\nI thread pool sono utilizzati in quasi tutte le applicazioni server, in cui c\'\xc3\xa8 l\'esigenza di trattare pi\xc3\xb9 richieste contemporanee da parte di un numero imprecisato di client._NEWLINE__NEWLINE_Molte altre applicazioni per\xc3\xb2 hanno bisogno che ogni task venga eseguito istantaneamente o che si abbia un controllo maggiore sul thread che lo esegue: in questo caso il thread pool non \xc3\xa8 la scelta migliore.\n_START_SECTION_\nEsempi\n_START_PARAGRAPH_\nDi seguito sono riportati alcuni esempi di utilizzo dei thread pool nei principali linguaggi di programmazione che li supportano nativamente.\n_START_SECTION_\nJava\n_START_PARAGRAPH_\nimport java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;public class Esempio {_NEWLINE_public static void main(String[ ] args) {_NEWLINE_//Creo un nuovo thread pool._NEWLINE_ExecutorService threadpool = Executors.newCachedThreadPool();_NEWLINE__NEWLINE_//Metto in coda il task_NEWLINE_threadpool.execute(_NEWLINE_            //Questo oggetto rappresenta il task._NEWLINE_                    new Runnable() {_NEWLINE_public void run() {_NEWLINE_System.out.println("Vengo eseguito dal thread pool.");_NEWLINE_}_NEWLINE_});_NEWLINE__NEWLINE_                System.out.println("Il thread principale prosegue e poi si mette in attesa.");_NEWLINE_threadpool.shutdown();_NEWLINE_                System.out.println("Il thread principale esce.");_NEWLINE_}}\n_START_SECTION_\nVisual Basic .NET\n_START_PARAGRAPH_\nImports System _NEWLINE_Imports System.ThreadingPublic Class Example_NEWLINE__NEWLINE_<MTAThread> _ _NEWLINE_Public Shared Sub Main() _NEWLINE_\' Metto in coda il task. _NEWLINE_ThreadPool.QueueUserWorkItem( _ _NEWLINE_        New WaitCallback(AddressOf ThreadProc) _ _NEWLINE_        )_NEWLINE__NEWLINE_Console.WriteLine("Il thread principale prosegue e poi si mette in attesa.") _NEWLINE_Thread.Sleep(1000)_NEWLINE__NEWLINE_Console.WriteLine("Il thread principale esce.") _NEWLINE_End Sub_NEWLINE__NEWLINE_\' Questa procedura rappresenta il task._NEWLINE_Shared Sub ThreadProc(stateInfo As Object) _NEWLINE_Console.WriteLine("Vengo eseguito dal thread pool.") _NEWLINE_End Sub _NEWLINE_End Class\n_START_SECTION_\nC# .NET\n_START_PARAGRAPH_\nusing System; _NEWLINE_using System.Threading; _NEWLINE_public class Example { _NEWLINE_public static void Main() { _NEWLINE_// Metto in coda il task. _NEWLINE_ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));_NEWLINE__NEWLINE_Console.WriteLine("Il thread principale prosegue e poi si mette in attesa.");_NEWLINE_Thread.Sleep(1000);_NEWLINE__NEWLINE_Console.WriteLine("Il thread principale esce."); _NEWLINE_}_NEWLINE__NEWLINE_// Questa procedura rappresenta il task._NEWLINE_static void ThreadProc(Object stateInfo) { _NEWLINE_Console.WriteLine("Vengo eseguito dal thread pool."); _NEWLINE_} _NEWLINE_}'