E 'possibile per due ExecutorServices di condividere un pool di thread?
-
21-08-2019 - |
Domanda
Ho una collezione di record da elaborare, e l'elaborazione possono essere parallelizzati, così ho creato un ExecutorService (tramite Esecutori # newCachedThreadPool () ). L'elaborazione di una scheda individuale è, in sé, composta da gradini parallelizzabili, quindi mi piacerebbe utilizzare un altro ExecutorService
. C'è un modo semplice per fare questo nuovo utilizzare lo stesso pool di thread sottostante? E 'anche desiderabile? Grazie.
Soluzione
Per rispondere alla tua domanda: non , due ExecutorService
oggetti non possono condividere un pool di thread. Tuttavia è possibile condividere un Executor
tra gli oggetti, o in alternativa creare diversi esecutori, se necessario, anche se questo è meno consigliata.
La migliore soluzione:. Condividere il <=> tra gli oggetti
Altri suggerimenti
Risposta breve:. No
Più rispondere: Avrete bisogno di una propria implementazione di farlo. ExecutorService
è un'interfaccia e AbstractExecutorService
è abbastanza facile da implementare.
Se si desidera che due <=> condividono lo stesso ThreadPool (ad esempio con differenti valore massimo filo attivo), è possibile utilizzare proxy pattern per rendere la condivisione ThreadPool <=>.
Si può solo passare un riferimento alla ExecutorService esistente per gli oggetti dei lavoratori?
public class Task implements Runnable {
private final ExecutorService threadPool;
private final SubTask[] subtasks;
public Task(ExecutorService threadPool) {
this.threadPool = threadPool;
this.subtasks = createSubtasksIGuess();
}
public void run() {
for(SubTask sub : subtasks)
threadPool.submit(sub);
}
}
Ci sono alcune buone ragioni per voler fare questo, come ad esempio i limiti e le metriche per coda separati. Per quanto ne so, Cassandra 2.1 non ha guadagnato irrilevante di utilizzare un servizio di implementazione esecutore con un pool di thread condivisa; il codice è a https: / /github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java .