2012-01-15 90 views
2

我正在使用Spring ThreadPoolTask​​Scheduler每5分鐘執行一次未同步的方法。有時該方法的執行時間超過5分鐘。我試圖觀察這種情況下的行爲,並且在當前執行完成之前(即使5分鐘的時間間隔結束),該方法似乎不會再次執行。ThreadPoolScheduler間隔小於任務的執行時間

儘管這適合我想要完成的任務,但我想知道爲什麼第二個線程在5分鐘後不會產生,並行執行方法的時間超過5分鐘。起初我認爲這與默認的池大小有關。但是,即使我增加了池的大小,行爲仍然是一樣的。

我試圖深入到ThreadPoolScheduler代碼,它看起來在內部通過ThreadPoolExecutor運行任務。它是否被設計爲只運行一個線程,等待一個執行完成後再觸發另一個線程,即使間隔已經過去?

至於代碼這個來講我我做什麼 -

<task:scheduler id="scheduler" pool-size="1" /> 


scheduler.scheduleAtFixedRate(new Runnable() { 
    public void run() { 
    executeThis(); // this takes more than 5 minutes sometime 
    } 
}, 5*60*1000); 

問候,

圖莎爾

回答

4

第二個線程沒有催生,因爲它會破壞法的合同,規定在its javadoc

如果該任務的任一執行時間比其週期更長的時間,然後 後續執行可能起步晚,但不會同時執行 。

此行爲是設計,記錄的行爲。

3

你的池大小爲1 - 因此,在5分鐘內,它提交新任務 - 但是,沒有線程可用來運行它。因此,任務會等到原始線程完成,然後計劃新任務。如果任務確實需要以固定的時間間隔開始,則增加池大小。

+0

正如我前面所說,我曾嘗試增加池大小,但似乎並未影響行爲。 – Tushar 2012-01-15 07:10:48