Ich erstelle ein ThreadPool
mit 10 festen Threads darin. Manchmal muss ich einen lang laufenden Thread im Thread-Pool unterbrechen, meistens, weil sie in einer Operation blockieren und ein Timeout auftritt und ich den Thread abbringe. Ich fange die InterruptedException
und setze den Status des Threads auch zu unterbrechen. In diesem Fall ist meine Frage, ob ThreadPool
einen neuen Thread erstellt und den unterbrochenen Thread durch einen neuen ersetzt.
Unten ist der Beispielcode, der vom Thread ausgeführt wird. Die Frage ist, wenn dieser Thread unterbrochen wird, ersetzt Thread-Pool diesen Thread durch einen neuen Thread?
Sie sollten Threads, die Sie nicht besitzen, nicht unterbrechen, weil Sie nicht wissen, wie sie reagieren. Da Sie die Thread-Planung nicht steuern können, wissen Sie nicht, dass ein bestimmter Thread eine bestimmte Aufgabe in dem Moment ausführt, in dem Sie ihn unterbrechen.
Wenn Sie eine Aufgabe, für die Sie einen Executor-Service angegeben haben, abbrechen möchten, rufen Sie cancel(true)
für die zugehörige Future
auf. Wenn Ihre Aufgabe eine Unterbrechungsanforderung feststellt, sollte sie den unterbrochenen Status beibehalten, indem sie Thread.currentThread().interrupt()
aufruft.
Wenn Sie dies tun, wird der Executor die Unterbrechung sauber behandeln, da es den Thread selbst unterbrochen hat, und weiß, dass der Thread eine Aufgabe ausgeführt hat, als der Interrupt aufgetreten ist.
Von der schrittweisen Fehlersuche nehme ich an, dass der unterbrochene Thread weiterhin von der Worker-Warteschlange getTask erhält. Der unterbrochene Status wurde bereits vor getTask bereinigt.
Wenn Sie beispielsweise FixedThreadPool mit LinkedBlockingQueue verwenden, wird der unterbrochene Status innerhalb von queue.take()
by ReentrantLock.lockInterruptibly()
Tags und Links java threadpool