ThreadPoolExecutor fixed thread pool mit benutzerdefinierten Verhalten
ich bin neu in diesem Thema ... ich bin mit einem ThreadPoolExecutor erstellt mit Treckern.newFixedThreadPool( 10 ) und nach der pool voll ist, ich fange an, ein RejectedExecutionException .
Gibt es eine Möglichkeit, um "Kraft" der Vollstrecker, um die neue Aufgabe in eine "warten" - status, statt Sie abzulehnen und zu starten, wenn der pool freigegeben wird ?
Dank
Thema dieses
https://github.com/evilsocket/dsploit/issues/159
Zeile des Codes beteiligt https://github.com/evilsocket/dsploit/blob/master/src/it/evilsocket/dsploit/net/NetworkDiscovery.java#L150
- Hast du es geschafft, eine Lösung zu finden für dieses problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
Executors.newFixedThreadPool(10);
es Warteschlangen der Aufgaben und warten Sie, bis ein thread fertig ist.Diese Methode ist
Wie Sie sehen können, die Warteschlange verwendet unbounded (das kann ein problem in sich selbst), aber es bedeutet, dass die Warteschlange füllen Sie nie und werden Sie nie eine Absage bekommen.
BTW: Wenn du die CPU-gebundene Aufgaben, eine optimale Anzahl von threads kann
Einer test-Klasse, die vielleicht illustrieren die situation
Drucke
RejectedExecutionException
bei Verwendung einesnewFixedThreadPool
wäre, wenn Sie versuchen, zu übermitteln Aufgaben der Testamentsvollstrecker nach seinemshutdown
Methode aufgerufen wurde.Es ist sehr möglich, dass ein thread ruft
exit
stelltmStopped
auf false und schließt den Testamentsvollstrecker, aber:while (!mStopped)
Schleife und versucht zu senden, eine Aufgabe, um die executor wurde Herunterfahren vonexit
while
gibt true zurück, da der Wechsel aufmStopped
nicht sichtbar ist (Sie müssen nicht jede form der Synchronisation rund um die Flagge).Ich würde vorschlagen:
mStopped
flüchtigenAufbauend auf früheren Vorschläge, die Sie verwenden können, eine blockierende Warteschlange zu konstruieren, die eine Feste Größe
ThreadPoolExecutor
. Wenn Sie dann liefern Ihre eigeneRejectedExecutionHandler
fügt Aufgaben in die Warteschlange blockiert, es verhält sich wie beschrieben.Hier ist ein Beispiel, wie Sie bauen konnten, wie ein Testamentsvollstrecker:
Wenn ich das richtig verstehe, haben Sie Ihre ThreadPool erstellt mit festen Anzahl von threads, aber haben Sie vielleicht mehr die Aufgabe vorgelegt werden, um die thread-pool. Ich würde calcuate die keepAliveTime auf der Grundlage der Anforderung und setzen es dynamisch. Auf diese Weise würde man nicht RejectedExecutionException.
Beispielsweise
long keepAliveTime = ((- Anwendungen.size() * 60) /FIXED_NUM_OF_THREADS) * 1000;
threadPoolExecutor.setKeepAliveTime(keepAliveTime, TimeUnit.MILLISEKUNDEN);
Anwendung ist eine Sammlung von Aufgaben, die anders sein könnte, jedes mal.
Dass sollte dein problem lösen, wenn Sie wissen, die Durchschnittliche Zeit, die Aufgabe zu übernehmen.