2012-11-18 46 views
1

我正在使用ExecutorService來調度將來要執行的任務。在我調用Callable之前執行了一些「奇怪的」行爲之前,我通過將我的Callable提交給ExecutorService池返回的Future對象上調用get()之前,我閱讀了一些文檔,發現提交的任務將在執行時間被提交或最遲在Future對象上調用get()時被提交。ExecutorService類,其中用戶控制何時調用Callables

我的問題 - 是否有任何類可以讓Callables提交給它,並只在get()被調用時執行?在這一點上,當我準備好執行它們時,似乎只是自己管理Callables並自己對它們調用call()似乎會完成我想要的操作,但我想確保已經沒有服務實現了這一點。

總之,是否有任何替代ExecutorService,讓我控制可調參數提交給它時被調用?注意 - 我希望他們調用將來的時間是可變的並且不確定,因爲我可能決定不調用它們,因此ScheduledExecutorService池在此處不起作用。

非常感謝!

+1

與從'call()'同步調用有什麼不同?線程有什麼好處? – SLaks

+0

這不一定。我只是要求確保沒有已經處理過的服務。鑑於下面的答案,我懷疑我應該手動執行此操作(正如您也建議的那樣)是要走的路! – Mark

+0

請注意,Future.get()是一個同步調用,它阻止調用線程的執行並使其等待可調用完成,因此犧牲了可調用(應該異步運行)的好處,除非您有非常特殊的要求,請勿在代碼中使用並依賴它。自動管理的任務執行是ExecutorService的一項功能,如果這不符合您的要求,只需不使用它,並在需要時直接在您的代碼中使用callable.call()/ runnable.run()。 – yorkw

回答

2

聽起來像你真的想使用Queue<Callable>,而只是輪詢隊列的任務。

通過這種方式,您可以隨心所欲地提交儘可能多的任務,並按您的意願逐一執行它們。

+0

很酷。感謝您的確認和快速回復! :) – Mark

相關問題