2013-05-08 60 views
0

所以我想用Timer和TimerTask類嘗試一下。讓程序運行5分鐘

我可以在30秒後得到一行代碼執行。 我一直在嘗試做的是讓這行代碼執行5分鐘。

這是我最初試圖

public static void main(String[] args) 
{ 
    for (int i = 0; i <= 10; i ++) 
    { 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() 
     { 
      public void run() 
      { 
       System.out.println("30 Seconds Later"); 
      } 
     }, 30000 
     ); 
    } 
} 

我用在for循環的10號,看是否timer.schedule將在循環的下一次迭代中等待下一個30秒。

任何想法我應該怎麼做呢?我試着用一個參數傳入的時間表方法使用schedule方法,但是這只是讓它重新執行,並且它永遠不會停止。

+0

可以[這](http://stackoverflow.com/questions/6181420/in-java-is-it-possible-to-execute-a - 方法 - 一段時間後停止)幫助? – Mateusz 2013-05-08 16:20:00

回答

1

你正在運行到的問題是,在不同的線程調度的Timer運行 - 這是,您的for循環的下一次迭代在調度後立即開始運行,而不是在30秒後開始運行。它看起來像你的代碼一次啓動了10個定時器,這意味着它們應該在30秒後大致打印一次。

當您嘗試使用schedule(帶有第三個參數)的重複版本時,您處於正確的軌道上。正如你所說,這不是你想要的,因爲它無限期地運行。然而,Timer確實有一個cancel方法來防止後續執行。

所以,你應該嘗試類似:

final Timer timer = new Timer(); 
// Note that timer has been declared final, to allow use in anon. class below 
timer.schedule(new TimerTask() 
{ 
    private int i = 10; 
    public void run() 
    { 
     System.out.println("30 Seconds Later"); 
     if (--i < 1) timer.cancel(); // Count down ten times, then cancel 
    } 
}, 30000, 30000 //Note the second argument for repetition 
); 
+0

完美的工作,謝謝=) – Shaun 2013-05-08 19:17:59

0

這裏有一個解決方法我很慚愧呈現:

package test; 

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

public class FiveMinutes { 

    private static int count = 0; 
    // main method just to add example 
    public static void main(String[] args) { 

     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       System.out.println("Count is: " + count); 
       if (count == 1) { 
        System.err.println("... quitting"); 
        System.exit(0); 
       } 
       count++; 
      } 
     }, 
     // starting now 
     new Date(), 
     // 5 minutes 
     300000l 
     ); 
    } 
} 

也請注意,應用程序可能無法運行正是5分鐘 - 看到文檔的TimerTask。

0

你的解決方案是非常接近的工作,你只需要乘以計數器的延遲(你的情況,i):

public static void main(String[] args) 
{ 
    for (int i = 1; i <= 10; i++) // start i at 1 for initial delay 
    { 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      public void run() 
      { 
       System.out.println("30 Seconds Later"); 
      } 
     }, 30000 * i); // 5 second intervals 
    } 
} 
2

Java已經在java.util.concurrent包中提供了一組豐富的API來實現這樣的任務。其中一個API是ScheduledExecutorService。例如,考慮如下代碼:此代碼將執行每30秒後Runnabletask爲高達5分鐘:

import java.util.concurrent.*; 

class Scheduler 
{ 
    private final ScheduledExecutorService service; 
    private final long period = 30;//Repeat interval 
    public Scheduler() 
    { 
     service = Executors.newScheduledThreadPool(1); 
    } 
    public void startScheduler(Runnable runnable) 
    { 
     final ScheduledFuture<?> handler = service.scheduleAtFixedRate(runnable,0,period,TimeUnit.SECONDS);//Will cause the task to execute after every 30 seconds 
     Runnable cancel = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       handler.cancel(true); 
       System.out.println("5 minutes over...Task is cancelled : "+handler.isCancelled()); 
      } 
     }; 
     service.schedule(cancel,5,TimeUnit.MINUTES);//Cancels the task after 5 minutes 
    } 
    public static void main(String st[]) 
    { 
     Runnable task = new Runnable()//The task that you want to run 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("I am a task"); 
      } 
     }; 
     Scheduler sc = new Scheduler(); 
     sc.startScheduler(task); 
    } 
}  
0

我不知道,如果這個解決方案有問題與垃圾回收或沒有,但我反正把它扔在這裏。也許有人清楚,我也學到了一些東西。基本上,如果有剩餘時間,定時器會設置一個新的定時器,並在5分鐘後停止。

Main.java:

public class Main { 
    public static void main(String[] args) { 
     MyTimer myTimer = new MyTimer(300000,30000); 
     myTimer.startTimer(); 
    } 
} 

MyTimer.java:

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

public class MyTimer { 
    private int totalRunningTime; 
    private int currentTime = 0; 
    private int intervalTime; 

    private Timer timer = new Timer(); 

    public MyTimer(int totalRunningTime, int intervalTime) { 
     this.totalRunningTime = totalRunningTime; 
     this.intervalTime = intervalTime; 
    } 

    public void startTimer() { 
     startTimer(intervalTime); 
    } 

    private void startTimer(int time) { 
     timer.schedule(new TimerTask() { 
      public void run() { 

       if (currentTime <= totalRunningTime - intervalTime) { 
        printTimeSinceLast(intervalTime/1000); 
        currentTime += intervalTime; 
        startTimer(intervalTime); 
       } else if (currentTime < totalRunningTime) { 
        int newRestIntervalTime = totalRunningTime - currentTime; 
        printTimeSinceLast(newRestIntervalTime/1000); 
        currentTime += newRestIntervalTime; 
        startTimer(newRestIntervalTime); 
       } 
      } 
     }, time); 
    } 

    private void printTimeSinceLast(int timeSinceLast) { 
     System.out.println(timeSinceLast + " seconds later."); 
    } 
}