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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top