爲ScheduledThreadPoolExecutor
該文檔稱, - 定於完全相同的執行時間 任務中提交的先入先出(FIFO)的順序啓用。ScheduledThreadPoolExecutor是否可以同時執行多個任務?
這是否意味着應該在同一時間完成的任務,絕不會在同一時間完成。相反,它們是按FIFO順序執行的?
如果是真的我用隨後類比Timer
更好,也沒有這個FIFO的問題?
爲ScheduledThreadPoolExecutor
該文檔稱, - 定於完全相同的執行時間 任務中提交的先入先出(FIFO)的順序啓用。ScheduledThreadPoolExecutor是否可以同時執行多個任務?
這是否意味着應該在同一時間完成的任務,絕不會在同一時間完成。相反,它們是按FIFO順序執行的?
如果是真的我用隨後類比Timer
更好,也沒有這個FIFO的問題?
一個的ScheduledThreadPoolExecutor工作的方式是有一個單一的「調度」或主站,它檢查任務來執行線程。
如果它找到一個任務,它將它委託給池中的「工作者」線程。
如果有多個任務準備執行時,他們是「開鑼」一次一個,雖然曾經「拉開序幕」,後續的處理是併發的,每個Java的定義。
如果您有兩個任務都是通過執行程序同時計劃的,那麼它們的完成順序可能因運行而異,除非您放入特定的控件,例如鎖,等待等。爲了處理這個問題,它取決於java的線程調度(java如何分配內核上的線程)來確定如何以及何時進行處理。請注意,設置這樣的鎖,等待等是一個看似複雜的任務,容易出現導致意外死鎖,活鎖等的競爭條件...
這取決於你的線程池的大小。如果您計劃在午夜啓動1000個任務,並且只有25個線程,則最初只能執行25個任務,而其他任務必須等待可用線程。這裏的FIFO是指執行程序將任務交給執行線程的順序。
請注意,文檔討論「啓用」任務和我們正在談論的線程池執行者。 :-)
這意味着任務會等到指定的時間,那麼他們將被視爲如果投入正常的ThreadPoolExecutor。如果池中有足夠的線程可用,所有這些任務將並行運行。
只有當您有更多任務變得比池中可用線程活躍時,某些任務將不得不等待。
謝謝。我在哪裏可以在ScheduledThreadPoolExecutor上獲得一些很好的教程? 我真的需要解釋這些事情是如何工作的,而不僅僅是API文檔。感謝你,我對每個班級的目的有了更好的理解。 :) – Time 2013-03-11 20:10:06
那麼,我建議你先回頭考慮一下你的要求是什麼併發。當你向線程池提交某些東西時,心態是「它會完成,非常接近我想要的時間」。如果您需要幾個以鎖步方式執行的可運行參數,請注意,這通常難以滿足要求,如果可能,請考慮將其鬆動。如果您想發佈一些細節,我很樂意提供幫助。一個開始學習更多關於java有什麼的好地方在這裏:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Taylor 2013-03-11 21:39:52
請告訴我這意味着什麼 - 您需要幾個以鎖步執行的runnable。如果我知道這個意思,那麼我可以告訴你這是否是我的要求。謝謝。 – Time 2013-03-11 21:44:51