2012-05-09 16 views
7

La classe ThreadPoolExecutor nei Java SE 6 documenti ha la seguente method:Java pool di thread esecutore Monitoraggio

public int getActiveCount()

Restituisce il numero approssimativo di thread che sono attivamente l'esecuzione di compiti.

Qual è il significato di approssimativa e esecuzione attivamente qui?

C'è qualche garanzia che, se prima, durante e dopo la chiamata a getActiveCount()

  1. N le discussioni sono state assegnate dal pool per l'esecuzione delle attività, e
  2. Nessuno di questi N thread sono disponibili per ulteriori compiti,

il numero intero restituito da getActiveCount() sarà esattamente N?

Se getActiveCount() non fornisce questa garanzia, esiste un altro modo per ottenere queste informazioni in modo più preciso?

precedenti domande in modo da:

ho guardato Thread Pool Executor Monitoring Requirement e How to tell if there is an available thread in a thread pool in java, ma non rispondere alle mie domande.

+0

Esiste una necessità specifica per un 'ThreadPoolExecutor', in questo caso potrebbe essere utilizzato un metodo factory come 'Executors.newFixedThreadPool (N)'? – posdef

+0

@posdef, ho bisogno di una coda di attività limitata. È possibile con 'newFixedThreadPool()'? –

+0

Bene, ciò che si ottiene è un servizio executor con un pool di thread di dimensioni definite dall'utente. Controlla i javadoc se soddisfa le tue esigenze. Li ho trovati davvero molto utili :) – posdef

risposta

9

Il motivo per cui è approssimativo è perché il numero potrebbe cambiare durante il calcolo; sei multi-threading. Prima che il calcolo sia completato, ora potrebbe essere attivo un numero diverso di thread (un thread che era inattivo quando selezionato è ora attivo).

Quando si dice "istanza temporale particolare" ... ciò non significa realmente nulla. Il calcolo non è istantaneo. Il numero che ottieni è la migliore risposta possibile data la natura fluida/dinamica della piscina.

Se per caso inizia il calcolo e completa mentre nessuno dei fili nello stato cambiamento piscina, allora sì che il numero è "esatto", ma solo fino ad un filo in piscina cambia stato, il che significa che potrebbe essere solo "esatto" per 1 ms (o meno).

+0

Non c'è un "cambio di stato" nei thread. Ho modificato la domanda in modo appropriato. –

+0

La mia risposta è ancora valida; l'ultimo paragrafo coprirebbe il tuo scenario. I paragrafi precedenti descrivono perché i documenti dicono * approssimativo * - in molti casi il tuo stato particolare non esiste dove il pool non è in flusso mentre il calcolo è fatto. –

+0

Brian - I * think * nell'attuale implementazione JDK, in realtà c'è un blocco globale che significa che il numero di thread non cambierà durante l'enumerazione. Ma la definizione dell'API lascia ovviamente aperta la possibilità che ciò non si verifichi in altre implementazioni future. –

2

Penso che potreste confondere le cose introducendo la nozione di "ricongiungimento al pool" che non esiste realmente nell'implementazione di ThreadPoolExecutor.

Ogni thread di lavoro si trova continuamente in attesa di un'attività (si trova effettivamente in cima a una coda di blocco). Ogni attività arriva alla sua coda, quell'operatore viene "bloccato", quindi viene eseguita qualsiasi operazione di manutenzione preliminare, quindi viene eseguita l'attività effettiva, quindi viene eseguita la manutenzione post-attività, quindi il lavoratore viene "sbloccato".

activeCount() fornisce il numero di thread nello stato "bloccato": notare che ciò significa che potrebbero effettivamente eseguire "operazioni di manutenzione" al momento preciso della chiamata di activeCount(), ma che deve essere conteggiato come " attivo ', deve esserci un compito effettivamente coinvolto, che sta per essere, attualmente, o che è appena stato eseguito.

Se questo equivale alla tua idea di "ricongiungimento alla piscina" non sono sicuro-- come dico, sembra che tu stia inventando una nozione che in senso stretto non esiste dal punto di vista di ThreadPoolExecutor.

+0

Questo spiega chiaramente la parte 'attivamente in esecuzione'. Grazie per aver sottolineato l'incoerenza. Ho aggiornato la domanda per rimuoverla. –