2010-10-31 33 views
2

我使用ThreadPoolExecutor來運行一些操作,在某些時候我取消了一些未來的任務並將其存儲到一個列表中,以便安排一些其他任務來完成,之後我想響應保存的取消未來任務。如何在線程池中響應已取消的futuretask?

但問題是,當我將任務提交到池中時,它不會被執行,看起來像被取消或完成標誌被線程執行程序保存和識別,因此該線程不會被調用。

我該怎麼辦?

回答

1

使用Runnable而不是線程。執行池可以像Thread一樣處理Runnable,但Runnable可以重新運行的次數。

+0

-1:不是答案。 OP不直接使用線程,他在ThreadPoolExecutor中使用FutureTasks。 Java庫中的所有執行池都是ThreadPoolExecutors,這是OP已經在使用的內容。 – 2010-11-01 23:49:11

3

FutureTask實現保持取消狀態。實質上,當再次調用run()方法時,它會執行CAS操作,該操作因爲狀態不可運行而不起作用,並且會立即返回而不調用內部的Callable的call()方法。我看不到一種方法來檢索原始Callable或將FutureTask恢復到未取消狀態。

迴應你應該怎麼做... 你必須取消他們嗎?爲什麼不讓他們跑?如果您想要優先執行,您可以嘗試使用PriorityBlockingQueue創建ThreadPoolexecutor,並使用Comparator來確定優先級。這將允許任務按正確的順序執行,因爲它們將根據Comparator的結果添加到PriorityBlockingQueue

+0

謝謝,實際上我只是實現了一個定製的FutureTask類,它包含對原始Runnable的引用,然後我可以重新提交它。 – virsir 2010-11-02 06:15:49

+0

@virsir,好的,但要小心。 FutureTask在執行者中的工作方式是儘管取消了它,FutureTask將被選中執行。取消標誌只是將run方法轉換爲no-op。您必須確保不要嘗試重新使用相同的FutureTask實例。 – 2010-11-02 19:47:39