Ich versuche, eine Lösung zu programmieren, bei der ein einzelner Thread E/A-intensive Aufgaben erzeugt, die parallel ausgeführt werden können. Jede Aufgabe hat erhebliche In-Memory-Daten. Ich möchte also die Anzahl der zu einem Zeitpunkt anstehenden Aufgaben begrenzen können.
Wenn ich den ThreadPoolExecutor wie folgt erstelle:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Dann wird die executor.submit(callable)
wirft RejectedExecutionException
wenn sich die Warteschlange füllt und alle Threads bereits belegt sind.
Was kann ich tun, damit executor.submit(callable)
blockieren, wenn die Warteschlange voll ist und alle Threads beschäftigt sind?
EDIT : Ich habe versucht este :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
Und es etwas erreicht die Wirkung, die ich erreicht, aber in einer uneleganten Art und Weise (im Grunde abgelehnt Threads in der aufrufenden Thread ausgeführt werden, so dass dies blockiert den aufrufenden Thread von mehr einreichen).
EDIT: (5 Jahre nachdem ich die Frage gestellt habe)
An alle, die diese Frage und ihre Antworten lesen: Bitte halten Sie die akzeptierte Antwort nicht für die einzig richtige Lösung. Bitte lesen Sie alle Antworten und Kommentare durch.