我環顧四周,但還沒有找到答案,所以我想確認一下。Java線程池/執行程序服務和wait()s - 線程和任務隊列發生了什麼?
說我有一個固定大小的線程池 - ExecutorService pool = Executors.newFixedThreadPool(5);
而且我有一些代碼:
pool.execute(new Runnable(){
try{
Object waitForMe = doSomethingAndGetObjectToWaitFor();
waitForMe.wait();
doSomethingElse();
}catch(Exception e){ throw new RunTimeException(e) }
});
讓我們假設上面的代碼被稱爲幾百倍。池中只有5個線程(所以上面的語句中只有5個應該在一個點上)。另外假設wait()
位於一個對象上,該對象正在對第三方進行一些I/O調用,並在操作完成時等待回調,因此自然需要一段時間才能完成。
現在我的問題是,當其中一個任務達到wait()
時的行爲是什麼,任務是否進入休眠狀態,然後線程池中的線程將另一個任務從隊列中取出並開始運行?
如果正在等待的任務進入睡眠狀態,當它獲得notify()
並且醒來時會發生什麼?線程是否回到線程池的隊列中(在前面或後面),並等待5個線程中的一個線程能夠繼續執行它(即調用doSomethingelse()
)?或者執行它的線程也進入休眠狀態,即5個執行程序線程中的一個線程等待任務(這是我所假設的)?或者執行程序線程接受另一個任務,並在第一個任務從wait()返回時被簡單地中斷?
感謝您的好評!通過回調選項,設置超時的最佳方式是什麼(比如說,如果沒有任何錯誤發生,則希望等待回調x秒)。我能想到的唯一方法是記下當前系統毫秒數並將其保存在一個列表中,並讓另一個線程監視超出當前時間並觸發錯誤的呼叫列表。我需要找到一本關於併發,回調等的好書。再次感謝! – NightWolf 2012-03-01 11:02:14
@NightWolf:關於超時查看我更新的答案。當談到一本好書時,[Java併發實踐](http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601)是必須的。 – 2012-03-01 11:06:05
感謝您的更新和圖書鏈接,好主意。可悲的是我對第三方沒有任何控制權。 – NightWolf 2012-03-01 11:12:04