2010-10-07 45 views
0

這個問題上this one一個後續。確實的ThreadPoolExecutor產生一個新的線程,如果當前線程休眠

基本上我在做什麼是聲明ThreadPoolExecutor只有一個線程。我重寫了beforeExecute()方法來進行睡眠,這樣我的每個任務都會在他們之間執行一些延遲。這基本上是放棄CPU到其他線程,因爲我的線程是顛簸。

所以,預期的行爲是:

對於在ThreadPoolExecutor每一個新的任務,它在執行任務之前調用之前執行的功能,因此它休眠比如說20年代它執行任務之前。

然而,這是我所看到的:

對於提交的每一個新任務:

  1. 它執行任務
  2. 調用beforeExecute方法
  3. 休眠比如說20多歲
  4. 重新執行任務!

1.的順序& 2.一直都不一樣。

這裏是我的問題:/睡眠期間

  1. 它出現了一個新的線程進來後繼續運行並執行我的任務馬上而實際線程處於休眠狀態。
    因此,一旦現有的線程休眠做的ThreadPoolExecutor產生新線程[思考該線程終止]? 我試圖把KeepAliveTime的>睡眠時間..所以,在情況下,上面的表述是真實的..它ATLEAST等待的時間超過睡眠時間,以產生一個新的線程... [希望能在平均時間休眠線程都睡不着和ThreadPoolExecutor將轉儲產生一個新的線程
  2. 即使它不產生一個新的線程,並執行我的任務馬上的想法,爲什麼會任務重新執行休眠線程醒來後!在此之前不應該將任務從隊列中取出嗎?
  3. 我在這裏錯過了什麼嗎?任何其他方式來調試這種情況?

=>我正在考慮完成所需任務(而不是解決問題)的另一種方法是將runnable封裝爲一個可運行的代碼,然後在調用內部代碼之前先休眠外部可運行的代碼。

回答

2

我想你要找的是一個ScheduledExecutorService

從我明白你的問題,scheduleAtFixedRate(的...)應該做這筆交易:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 

創建並執行一個在 給定初始延遲後首次啓用的定期操作 ,隨後與給定的週期 ;即 執行後將開始 initialDelay然後initialDelay +期間, 然後initialDelay + 2 *期間,所以 上。

+0

thnx指出這..這是一些接近,但不完全是我想要的。基本上這裏的下一個任務是基於時間= 0進行計劃的。因此,不管執行我的預先任務的時間如何,新任務都會被踢掉。 [在多線程env中,不能保證它是否等間距] ..............................它會是很高興有一個新的任務,只有在先前一個完成後的一些延遲啓動..但是,我可能會稍後再給這個.. – codeObserver 2010-10-07 18:41:26

+0

我注意到有一種方法scheduleWithFixedDelay可能適合我.. – codeObserver 2010-10-07 18:51:40

0
  1. 不,這不是它的工作原理。 ThreadPoolExecutor知道它有一個工作線程,即使該工作者是RUNNABLE,WAITINGBLOCKED或任何其他狀態。
  2. beforeExecute方法被調用之前很久就從BlockingQueue中刪除了該任務。
  3. 您可以自己查看API的代碼並確定它在做什麼。每個Java JDK安裝都包含一個包含整個Java庫的「src.zip」文件。如果yu還沒有,你可以在eclipse中附加這個源代碼,然後在eclipse中調試潛入庫方法時,將顯示源代碼而不僅僅是類文件。