2014-06-29 198 views
-1

當我們使用Java的Executor服務創建一個線程池並向這個線程池提交線程時,這些線程的執行順序是什麼?Java線程池ExecutorService:線程執行順序

我想確保線程先提交,先執行。 例如,在下面的代碼,我想先5個線程會首先執行,然後是下一個5個線程等等...

// Create a thread pool of 5 threads. 
ScheduledExecutorService exService = Executors.newScheduledThreadPool(5, new ModifiedThreadFactory("ReadThreadPool")); 

// Create 100 threads. 
MyThread[] threads = createMyThreads(100); 

// Submit these 100 threads to thread pool for execution. 
for(MyThread thread : threads) { 
    exService.submit(thread); 
} 

確實Java的線程池用於這一目的提供任何API,或我們是否需要在我們的末端實現一個FIFO隊列來實現這一點。 如果Java的線程池不提供任何這樣的功能,我真的有興趣瞭解這個功能不存在的原因,因爲它看起來像是一個非常常見的用例。 技術上不可能(我認爲這不太可能),還是僅僅是一個小姐?

+2

哥們這是寫在該類 –

+0

的Javadoc,我希望那些'MyThread'對象只是名不副實,並沒有真正延伸' java.lang.Thread'。他們應該是'Runnable'任務。執行者會給他們一個線程來執行。 ('Thread'實現'Runnable'這個事實是一個歷史性的錯誤。) – Boann

回答

4

這是默認行爲。 ScheduledThreadExecutor(你使用的是,雖然你沒有安排任何事情)從ThreadPoolExecutor延伸。提交到ThreadPoolExecutor的任務存儲在BlockingQueue中,直到有一個線程可用於執行它們並執行它們。隊列是FIFO。

這是在the javadoc詳細說明。

+0

任務按FIFO順序從隊列中取出,但如果存在多個工作線程,則不一定是它們完成的順序。很難說這是否是OP要求的。 – Boann

+0

在我的測試中,任務不是以FIFO順序開始的,請你幫助我的問題http://stackoverflow.com/questions/42153013/why-tasks-in-threadpool-are-not-executed-follow- fifo-java?noredirect = 1#comment71472912_42153013? – Jaskey

1

線程無法執行。線程是運行taska的實體,如RunnableCallable。將這樣的任務提交給執行者服務會將其置於其內部的BlockingQueue中,直到它從線程池中被線程獲取。這仍然會告訴你任何關於執行不同類別的順序可以做不同的事情,同時實施Runnable