Il thread pool è in realtà un'implementazione della tecnologia di pooling. L'idea centrale della tecnologia di pooling è realizzare il riutilizzo delle risorse ed evitare il sovraccarico delle prestazioni causato dalla ripetuta creazione e distruzione delle risorse. Il pool di thread può gestire un gruppo di thread in modo che i thread non vengano distrutti dopo aver completato l'attività, ma continuino a elaborare le attività che sono state inviate da altri thread.
Vantaggi dell'utilizzo del pool di thread
Ridurre il consumo di risorse. Riduci il costo di creazione e distruzione dei thread riutilizzando i thread creati.
Migliora la velocità di risposta. Quando arriva un'attività, l'attività può essere eseguita immediatamente senza attendere la creazione del thread.
Migliora la gestibilità dei thread. I thread sono risorse scarse. Se vengono creati senza restrizioni, non solo consumeranno risorse di sistema, ma ridurranno anche la stabilità del sistema. Il pool di thread può essere utilizzato per l'allocazione, l'ottimizzazione e il monitoraggio unificati.
Parametri di costruzione
corePoolSize: utilizzato per lavorare nel pool di threadNumero di thread principali。
dimensionemassima della piscina:Numero massimo di thread , il numero massimo di thread che è consentito creare dal pool di thread. Quando il numero di thread nel pool di thread raggiunge corePoolSize, se la coda delle attività è piena e devono essere elaborate nuove attività, il pool di thread creerà nuovi thread (ma il numero totale non supera il massimoPoolSize) per elaborare queste attività. (Ciò equivale a quando l'area della coda è piena, i thread successivi possono saltare direttamente nella coda.) Se il numero di attività supera il limite massimo di PoolSize e la coda delle attività è piena, il pool di thread elaborerà queste attività non eseguibili in base alla politica di rifiuto.
keepAliveTime: il tempo di sopravvivenza dei thread creati dopo aver superato corePoolSize o tutti i threadTempo massimo di sopravvivenza, a seconda della configurazione.
unità: keepAliveTimeunità di tempo。
coda di lavoro:coda di attività , è una coda di blocco Quando il numero di thread raggiunge il numero di thread principali, l'attività verrà archiviata nella coda di blocco. Implementazioni comuni: classi di implementazione dell'interfaccia BlockingQueue, come ArrayBlockingQueue, LinkedBlockingQueue, ecc.
threadFactory: utilizzato per creare thread all'interno del pool di threadfabbrica。
gestore:Negare la politica;Quando la coda è piena e il numero di thread raggiunge il numero massimo di thread, questo metodo verrà chiamato per elaborare l'attività.
Come impostare i parametri
1. Determinare il numero di thread principali (corePoolSize)
Attività ad uso intensivo della CPU: per le attività ad uso intensivo della CPU, è comune impostare il numero di thread core su un valore compreso tra 1 e 2 volte il numero di core della CPU. Ciò garantisce il pieno utilizzo delle risorse della CPU evitando eccessivi cambi di contesto.
Attività ad uso intensivo di I/O: per le attività ad uso intensivo di I/O, poiché i thread non occupano la CPU in attesa di operazioni di I/O, è possibile impostare più thread principali. In generale, il numero di thread core può essere impostato su più di 2 volte il numero di core della CPU in modo che sia possibile elaborare più attività durante l'attesa dell'I/O.
Attività miste: se l'applicazione contiene attività ad uso intensivo di CPU e di I/O, è necessario bilanciare le impostazioni per il numero di thread principali in base alla situazione specifica.
2. Determinare il numero massimo di thread (maximumPoolSize)
Ambienti con risorse limitate: negli ambienti con risorse limitate (come sistemi incorporati o server cloud), il numero massimo di thread deve essere limitato per evitare che troppi thread occupino risorse.
Sistema ad alta concorrenza: per i sistemi che devono gestire un numero elevato di richieste simultanee, il numero massimo di thread può essere opportunamente aumentato per migliorare le capacità di elaborazione simultanea del sistema. Tuttavia, l'impostazione del numero massimo di thread dovrebbe essere considerata in modo globale in base alla capacità di carico e alle condizioni delle risorse del sistema.
3. Imposta il tempo di inattività del thread (keepAliveTime)
Applicazioni ad uso intensivo della CPU: per le applicazioni ad uso intensivo della CPU, in genere è possibile impostare il tempo di inattività del thread su un valore più breve perché le risorse della CPU sono molto preziose e non si desidera che troppi thread inattivi occupino risorse. In alcuni casi, può anche essere impostato su 0, a indicare che i thread non core non vengono conservati.
Applicazioni ad uso intensivo di I/O: per le applicazioni ad uso intensivo di I/O, poiché i thread non occupano risorse della CPU in attesa di operazioni di I/O, il tempo di inattività del thread può essere impostato su un valore più lungo (ad esempio più di 1 minuto) per evitare l'avvio e la distruzione frequenti del thread . il sovraccarico delle prestazioni causato.
4. Seleziona la coda delle attività (workQueue)
coda delimitata : l'utilizzo di una coda delimitata può limitare il tempo di attesa delle attività nella coda ed evitare l'overflow della memoria dovuto a troppe attività. Tuttavia, se la lunghezza della coda è troppo piccola, le attività potrebbero essere rifiutate. (Generalmente scegli la coda delimitata)
Coda illimitata: l'utilizzo di una coda illimitata può memorizzare nella cache tutte le attività il più possibile, ma è necessario prestare attenzione ai problemi di consumo di memoria. Se viene utilizzata una coda illimitata, il parametro del numero massimo di thread del pool di thread potrebbe non essere più valido poiché il pool di thread non tenta di creare nuovi thread per elaborare le attività nella coda.
5. Configura la thread factory (threadFactory)
La thread factory viene utilizzata per creare nuovi thread. Personalizzando la thread factory, è possibile impostare attributi quali priorità del thread e stato del thread daemon, nonché impostare nomi significativi per i thread per facilitare la diagnosi dei problemi nella JVM.
6. Configurare la politica di rifiuto (gestore)
Quando il pool di thread non è in grado di elaborare nuove attività (ovvero, il numero di thread ha raggiunto il valore massimo di PoolSize e la coda delle attività è piena), è necessario configurare una policy di rifiuto per gestire queste attività non eseguibili.Le strategie di rifiuto comuni includonoGenera direttamente un'eccezione、Utilizzare il thread del chiamante per eseguire l'attività、Ignora le nuove attività e scarta quelle più vecchie nella coda Aspettare. Puoi anche personalizzare la politica di rifiuto secondo necessità.