2013-03-11 44 views
6

ScheduledThreadPoolExecutor該文檔稱, - 定於完全相同的執行時間 任務中提交的先入先出(FIFO)的順序啓用。ScheduledThreadPoolExecutor是否可以同時執行多個任務?

這是否意味着應該在同一時間完成的任務,絕不會在同一時間完成。相反,它們是按FIFO順序執行的?

如果是真的我用隨後類比Timer更好,也沒有這個FIFO的問題?

回答

4

一個的ScheduledThreadPoolExecutor工作的方式是有一個單一的「調度」或主站,它檢查任務來執行線程。

如果它找到一個任務,它將它委託給池中的「工作者」線程。

如果有多個任務準備執行時,他們是「開鑼」一次一個,雖然曾經「拉開序幕」,後續的處理是併發的,每個Java的定義。

如果您有兩個任務都是通過執行程序同時計劃的,那麼它們的完成順序可能因運行而異,除非您放入特定的控件,例如鎖,等待等。爲了處理這個問題,它取決於java的線程調度(java如何分配內核上的線程)來確定如何以及何時進行處理。請注意,設置這樣的鎖,等待等是一個看似複雜的任務,容易出現導致意外死鎖,活鎖等的競爭條件...

+0

謝謝。我在哪裏可以在ScheduledThreadPoolExecutor上獲得一些很好的教程? 我真的需要解釋這些事情是如何工作的,而不僅僅是API文檔。感謝你,我對每個班級的目的有了更好的理解。 :) – Time 2013-03-11 20:10:06

+0

那麼,我建議你先回頭考慮一下你的要求是什麼併發。當你向線程池提交某些東西時,心態是「它會完成,非常接近我想要的時間」。如果您需要幾個以鎖步方式執行的可運行參數,請注意,這通常難以滿足要求,如果可能,請考慮將其鬆動。如果您想發佈一些細節,我很樂意提供幫助。一個開始學習更多關於java有什麼的好地方在這裏:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Taylor 2013-03-11 21:39:52

+0

請告訴我這意味着什麼 - 您需要幾個以鎖步執行的runnable。如果我知道這個意思,那麼我可以告訴你這是否是我的要求。謝謝。 – Time 2013-03-11 21:44:51

1

這取決於你的線程池的大小。如果您計劃在午夜啓動1000個任務,並且只有25個線程,則最初只能執行25個任務,而其他任務必須等待可用線程。這裏的FIFO是指執行程序將任務交給執行線程的順序。

+0

好吧,所以線程數應該> =任務數量?如果我們不知道在某個特定時間可能需要完成多少任務,則包含「>」作爲安全餘量。 – Time 2013-03-11 19:12:18

+1

@時間:這些任務實際上需要同時發生嗎?如果你能解釋推動這一點的要求,這可能會有所幫助。 – Taylor 2013-03-11 19:29:20

+1

正如其他答案已經指出的那樣,計劃時間是將任務提交給執行池的時間。這是一個設計決定你想要多少個線程,回想一下,真正的同時執行需要並行執行,這受到硬件內核的限制。 – 2013-03-11 19:30:15

1

請注意,文檔討論「啓​​用」任務和我們正在談論的線程池執行者。 :-)

這意味着任務會等到指定的時間,那麼他們將被視爲如果投入正常的ThreadPoolExecutor。如果池中有足夠的線程可用,所有這些任務將並行運行。

只有當您有更多任務變得比池中可用線程活躍時,某些任務將不得不等待。

相關問題