Ich versuche, eine Lösung zu codieren, bei der ein einzelner Thread E / A-intensive Aufgaben erzeugt, die parallel ausgeführt werden können. Jede Aufgabe verfügt über signifikante In-Memory-Daten. Daher möchte ich in der Lage sein, die Anzahl der Aufgaben zu begrenzen, die gerade anstehen.
Wenn ich ThreadPoolExecutor wie folgt erstelle:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Dann die executor.submit(callable)
Würfe, RejectedExecutionException
wenn die Warteschlange voll ist und alle Threads bereits beschäftigt sind.
Was kann ich tun, um zu executor.submit(callable)
blockieren, wenn die Warteschlange voll ist und alle Threads beschäftigt sind?
EDIT : Ich habe versucht , dies :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
Und es erreicht etwas den Effekt, den ich erreichen möchte, aber auf unelegante Weise (grundsätzlich werden abgelehnte Threads im aufrufenden Thread ausgeführt, sodass der aufrufende Thread nicht mehr gesendet werden kann).
EDIT: (5 Jahre nach der Frage)
Wenn Sie diese Frage und ihre Antworten lesen, nehmen Sie die akzeptierte Antwort bitte nicht als eine richtige Lösung. Bitte lesen Sie alle Antworten und Kommentare durch.