2013-11-25 270 views
2

我正在創建一個新線程來檢查新文件的文件夾,然後在指定的時間內休眠。ScheduledExecutorService等待任務完成

我的首選是使用ScheduledExecutorService,但是我找不到任何文檔來闡明服務在啓動新服務之前是否等待當前正在運行的任務完成。

例如,如果我有以下代碼;

Integer samplingInterval = 30; 
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10); 
executorService.scheduleAtFixedRate(new WatchAgent(agentInfo), 0, samplingInterval, TimeUnit.SECONDS); 

如果WatchAgent的run()花費的時間超過30秒,是否會在完成之前創建新代理?其次,如果我創建了一個WatchAgent的實例,我可以對每個定期運行使用相同的實例嗎?

回答

4

scheduleAtFixedRate的Javadoc:

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

scheduleAtFixedRate顧名思義就是單個Runnable實例。您無法爲每個run調用提供不同的實例。因此,要回答您的問題,每次定期運行總是使用相同的實例。

3

請嘗試下面的測試代碼。

1)是的,它似乎等到run()結束。

2)是的,似乎它使用的是同一個實例的運行方法(當您調用scheduleAtFixedRate時傳入的方法;這使btw完美)。

import java.util.Date; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 


public class Test006 { 

    public static void main(String[] args) { 
     Object agentInfo = null; 
     Integer samplingInterval = 30; 
     ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10); 
     executorService.scheduleAtFixedRate(new WatchAgent(agentInfo), 0, samplingInterval, TimeUnit.SECONDS); 
    } 

} 


class WatchAgent implements Runnable { 

    public WatchAgent(Object info){ 

    } 

    public void run(){ 
     try{ 
      System.out.println("Running " + this.hashCode() + " - started on/at " + (new Date())); 
      Thread.sleep(60000); 
      System.out.println("Running " + this.hashCode() + " - finished on/at " + (new Date())); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
}