Zukünftige Aufgabe abgelehnt, von ThreadPoolExecutor
Ich habe eine ThreadPoolExecutor
und ich, Einreichen einer Aufgabe zu.
private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
Dieser code legt die Runnable
zu den ThreadPoolExecutor
.
protected void waitAndSweep(final String symbol) {
runnable = new Runnable() {
public void run() { /* irrelevant code */ }
};
try {
Future<?> self = threadPoolExecutor.submit(runnable);
futures.add(self);
} catch (RejectedExecutionException re) {
/* this exception will be thrown when wait and sweep is called more than twice.
* threadPoolExecutor can have one running task and one waiting task.
*/
} catch (Exception e) {
logEvent(StrategyEntry.ERROR, "waitAndSweep", symbol, "Exception caught...", e);
}
}
Den folgenden code beendet die Aufgabe.
protected synchronized void stop(StrategyEntry entry) throws Exception {
for (Object future : futures) {
((Future<?>) future).cancel(true);
}
futures.clear();
threadPoolExecutor.shutdown();
}
Ist hier das problem: Wenn ich versuche zu stoppen, die Aufgabe ist, erhalte ich folgende exception:
Aufgabe java.util.concurrent.FutureTask@3a475611 abgelehnt java.util.concurrent.ThreadPoolExecutor@216393fb[Beendet, die pool-Größe = 0, active threads = 0, in der Warteschlange-Aufgaben = 0, abgeschlossene Aufgaben = 1]
- Rufen Sie
shutdown()
auf diesem executor irgendwo? - ja in der stop-Methode
- Sie erstellen eine Unterlage, Warteschlange mit Kapazität 1 - ist es eine andere Aufgabe, die bereits dort?
- Aus der Fehlermeldung, die er bekommt, es ist deutlich sichtbar, dass der Testamentsvollstrecker ist in der
Terminated
Zustand -, die, was die Ursache der Ausnahme. - Wenn eine andere Aufgabe bereits dort, Testamentsvollstrecker wird diese Aufgabe ablehnen und es wird gefangen werden durch die catch-block und wird es nie in der GUI angezeigt.
- Welche Zeile in Ihrem code die Ausnahme ausgelöst? Was ist der Typ der Ausnahme?
- Haben Sie jemals zu verwalten, um eine Antwort auf diese Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie
shutdown()
die excutor in der stop-Methode. Wenn Sie wollen einfach nur zu warten, bis die Aufgabe abgeschlossen ist, verwenden SieFuture.get()
. Wenn ein Testamentsvollstrecker ist stillgelegt, die Aufgaben können nicht mehr vorgelegt werden es.shutdown()
sollte nur verwendet werden, wenn Sie wirklich wollen, um die Anwendung zu beenden.stop()
Methode tatsächlich zu tun. Vielleicht können Sie das klären?