2012-12-18 40 views
7

我在我的Java應用程序中實現了訂閱。當新用戶加入,應用程序創建新任務(類,它實現Runnable在單獨的線程中運行),並且將其添加到ExecutorService,如:停止提交給ExecutorService的Runnable

public void Subscribe() 
{ 
    es_.execute(new Subscriber(this, queueName, handler)); 
} 

//... 

private ExecutorService es_; 

應用,只要你想可以註冊爲許多用戶。現在我想要實現像Unsubscribe這樣的每個用戶都有能力停止消息流。在這裏,我需要一種方法來停止在ExecutorService中運行的其中一項任務。但我不知道我該如何做到這一點。

ExecutorService.shutdown()及其變化不適用於我:它們終止所有任務,我只想終止其中一個任務。我正在尋找解決方案。儘可能簡單。謝謝。

回答

8

您可以使用ExecutorService#submit代替execute和使用返回Future對象,試圖取消使用Future#cancel

例的任務(假設SubscriberRunnable):

Future<?> future = es_.submit(new Subscriber(this, queueName, handler)); 
... 
future.cancel(true); // true to interrupt if running 

的重要注意事項來自評論:

If your task doesn't honour interrupts and it has already started, it will run to completion.

+0

這將是如果您編輯您的答案以添加簡單示例,則會很有用我可以在文檔和谷歌中找到所有的東西,但答案不僅適用於我,也適用於其他方面。這可以節省一些(非常寶貴的)時間。 – maverik

+0

這裏你去,簡單的例子 –

+0

謝謝。這真的很有幫助。 – maverik

3

而不是使用ExecutorService.execute(Runnable)嘗試使用Future<?> submit(Runnable)。該方法將提交Runnable到池中執行,它將返回一個Future對象。通過這樣做,您將擁有對所有用戶線程的引用。

爲了阻止特定線程只使用futureObj.cancel(true)。這會中斷正在運行的線程,並拋出InterruptedException。用戶線程應該以這種異常情況下將停止處理的方式進行編碼(例如,對於整個方法,包裝器的try/catch塊爲Thread.sleep(millis))。

您CAND找到官方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