Stoppen einer Lauffähigen vorgelegt ExecutorService
Habe ich umgesetzt-Abonnement in meiner Java app. Wenn neue Abonnenten Hinzugefügt, erstellt die Anwendung neuer task (Klasse implementiert die Runnable
ausgeführt werden, im separaten thread) und es wird Hinzugefügt, um die ExecutorService
wie:
public void Subscribe()
{
es_.execute(new Subscriber(this, queueName, handler));
}
//...
private ExecutorService es_;
Anwendung kann registrieren, wie viele Abonnenten, wie Sie wollen. Jetzt möchte ich etwas umzusetzen, wie Unsubscribe
so dass jeder Abonnent hat die Fähigkeit zu beenden Sie den message flow. Hier muss ich einen Weg zu stoppen, ist eine der Aufgaben läuft in der ExecutorService
. Aber ich weiß nicht, wie ich dies tun kann.
Den ExecutorService.shutdown()
und seine Variationen sind nicht für mich: Sie beendet alle Aufgaben, ich will nur kündigen, einer von Ihnen. Ich bin auf der Suche nach einer Lösung. So einfach wie möglich. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ExecutorService#submit statt
execute
und die zurückgegebenenFuture
Objekt, um zu versuchen und brechen Sie den Vorgang mit Zukunft#AbbrechenBeispiel (unter der Annahme
Subscriber
ist einRunnable
):Wichtiger Hinweis aus den Kommentaren:
If your task doesn't honour interrupts and it has already started, it will run to completion.
Anstatt
ExecutorService.execute(Runnable)
versuchen Sie es mitFuture<?> submit(Runnable)
. Diese Methode legt denRunnable
in den pool für die Ausführung und wird es wieder einFuture
Objekt. Dadurch haben Sie Verweise auf alle Abonnenten threads.Damit aufhören, bestimmte Threads einfach zu verwenden
futureObj.cancel(true)
. Diese unterbrechen den Laufenden thread, werfen einInterruptedException
. Die Abonnenten thread sollte codiert werden, so wird es aufhören, die Verarbeitung im Fall dieser Ausnahme (zum BeispielThread.sleep(millis)
mit wrapper try /catch-block für die ganze Methode).Ihnen cand weitere Informationen finden Sie auf der offiziellen API:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html