2015-06-09 33 views
6

我們想要調度java進程以運行至特定時間間隔。目前我正在考慮使用TimerTask來安排這個過程。在每個循環開始時,將檢查當前時間,然後與給定時間進行比較,如果時間已過,則停止進程。 我們的代碼如下所示:對於給定延遲的特定時間間隔調度java進程

import java.util.Timer; 
import java.util.TimerTask; 

public class Scheduler extends TimerTask{ 

    public void run(){ 
     //compare with a given time, with getCurrentTime , and do a System.exit(0); 
     System.out.println("Output"); 
    } 

    public static void main(String[] args) { 
     Scheduler scheduler = new Scheduler(); 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(scheduler, 0, 1000); 

    } 

} 

有沒有更好的方法呢?

回答

3

而不是檢查是否已在每次迭代中達到時間限制,您可以安排另一個任務的上述時間限制和取消您的計時器。

根據複雜性,您可能會考慮使用ScheduledExecutorService(如ScheduledThreadPoolExecutor)。 See in this answer when and why.

簡單的工作例如用定時器:

public class App { 
    public static void main(String[] args) { 
     final Timer timer = new Timer(); 
     Timer stopTaskTimer = new Timer(); 
     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("Output"); 
      } 
     }; 
     TimerTask stopTask = new TimerTask() { 
      @Override 
      public void run() { 
       timer.cancel(); 
      } 
     }; 

     //schedule your repetitive task 
     timer.scheduleAtFixedRate(task, 0, 1000); 
     try { 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date date = sdf.parse("2015-06-09 14:06:30"); 
      //schedule when to stop it 
      stopTaskTimer.schedule(stopTask, date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

感謝approach.I可以試試這個。 – Anupam

+0

我用一個例子更新了答案。 –

+0

感謝您的代碼示例。我們可能會使用ScheduledExecutorService,但現在,上面的代碼對我們來說是完美的。 – Anupam

2

您可以使用RxJava,進行無編程功能非常強大的庫。

Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS); 
t.subscribe(new Action1() { 
         @Override 
         public void call(Object o) { 
          System.out.println("Hi "+o); 
         } 
        } 

) ; 
try { 
    Thread.sleep(10000); 
}catch(Exception e){ } 

你甚至可以使用lambda語法:

Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS); 
t.forEach(it -> System.out.println("Hi " + it)); 
try { 
    Thread.sleep(10000); 
}catch(Exception e){ }