Ist das hinzufügen von Aufgaben zu BlockingQueue von ThreadPoolExecutor ratsam?

In der JavaDoc für ThreadPoolExecutor ist unklar, ob es akzeptabel ist, fügen Sie die Aufgaben direkt auf die BlockingQueue sichern der Vollstrecker. Die docs sagen aufrufen executor.getQueue() "soll in Erster Linie für debugging und monitoring".

Ich Baue eine ThreadPoolExecutor mit meinen eigenen BlockingQueue. Ich behalten Sie einen Verweis auf die Warteschlange, so kann ich Aufgaben hinzufügen, um es direkt. Die gleiche Warteschlange zurückgegeben wird getQueue() so nehme ich die Ermahnung in getQueue() gilt für einen Verweis auf die Unterstützung Warteschlange erworben durch meine bedeutet.

Beispiel

Allgemeinen Muster des Codes:

int n = ...; //number of threads
queue = new ArrayBlockingQueue<Runnable>(queueSize);
executor = new ThreadPoolExecutor(n, n, 1, TimeUnit.HOURS, queue);
executor.prestartAllCoreThreads();
//...
while (...) {
    Runnable job = ...;
    queue.offer(job, 1, TimeUnit.HOURS);
}
while (jobsOutstanding.get() != 0) {
    try {
        Thread.sleep(...);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}
executor.shutdownNow();

queue.offer() vs executor.execute()

Als ich verstehen es, die typische Verwendung ist das hinzufügen von Aufgaben über executor.execute(). Der Ansatz in meinem obigen Beispiel hat den Vorteil, blockieren die Warteschlange in der Erwägung, dass execute() versagt sofort, wenn die Warteschlange voll ist und lehnt meine Aufgabe. Ich mag auch, dass das senden von Aufträgen interagiert mit einer blocking-queue; fühlt sich mehr der "reinen" Produzenten-Konsumenten zu mir.

Eine Implikation hinzufügen von tasks an die Warteschlange direkt: ich muss anrufen prestartAllCoreThreads() sonst keine worker-threads ausgeführt werden. Vorausgesetzt, dass keine anderen Wechselwirkungen mit dem Testamentsvollstrecker, nichts wird die überwachung der Warteschlange (Prüfung der ThreadPoolExecutor Quelle bestätigt dies). Dies bedeutet auch für die direkte einreihen, die die ThreadPoolExecutor muss zusätzlich konfiguriert werden > 0 core threads und darf nicht so konfiguriert werden, dass Kern-threads, timeout.

tl;dr

Gegeben ThreadPoolExecutor wie folgt konfiguriert:

  • core threads > 0
  • core-threads sind nicht erlaubt timeout
  • core-threads werden prestarted
  • einen Verweis auf die BlockingQueue sichern der Testamentsvollstrecker

Ist es akzeptabel, Aufgaben hinzufügen, direkt an der Warteschlange anstelle von aufrufen executor.execute()?

Verwandte

Diese Frage ( producer/consumer-Arbeit Warteschlangen ) ist ähnlich, aber nicht gezielt ein cover hinzufügen, um die Warteschlange direkt.

  • "Ich behalte mir einen Verweis auf die Warteschlange, so kann ich Aufgaben hinzufügen, um es direkt" aber warum sollte Sie das tun? Warum nicht einfach senden Sie Sie an die executor?
  • siehe oben, wo ich Schreibe "Der Ansatz in meinem obigen Beispiel hat den Vorteil, dass die Blockierung in der Warteschlange..."
InformationsquelleAutor toolbear | 2011-04-07
Schreibe einen Kommentar