2010-06-23 55 views
3

我想在java.null中編寫一個定時器,它將執行以下操作: 程序啓動時,啓動定時器1,它將在45分鐘後停止,同時啓動第二個定時器,這將會在15分鐘後停止。此時第一個定時器將再次啓動,並重覆上述循環,直到程序退出 第一個定時器:45分鐘(我可以使用計算機的時間) 第二個定時器:15分鐘(暫停時間) 第一個定時器:45分鐘(時間我可以使用計算機) 第二定時器:15分鐘(暫停時間) 第一定時器:45分鐘(我可以使用計算機的時間) 第二定時器:15分鐘(暫停時間)Java如何編寫定時器

我不知道如何使用線程和定時器(utils,swing),所以我試圖使用while(true),但CPU上升。 這裏是我當前的代碼

static int getMinute(){ 
    Calendar cal=Calendar.getInstance(); 
    int minute=cal.getTime().getMinutes(); 
    return minute; 
} 

public static Runnable clockf(){ 
    if (endTime>=60){ 
     endTime=endTime-60;} 
    System.out.println(startTime); 
    System.out.println(currentTime); 
    System.out.println(endTime); 

    if(currentTime==endTime){ 
     pauseStart=getMinute(); 
     currentTime=getMinute(); 
     pauseEnd=pauseStart+15; 

     if(currentTime==pauseEnd){ 
      pauseStart=0; 
      pauseEnd=0; 
      startTime=getMinute(); 
      currentTime=getMinute(); 
      endTime=startTime+45; 
     } 
    } 
    else{ 
     update(); 
    } 

    return null; 

}

private static void update() { 
    currentTime=getMinute(); 
    System.out.println(currentTime); 
} 

public static void main(String[] args) { 
    startTime=getMinute(); 
    currentTime=getMinute(); 
    endTime=startTime+45; 

    Thread t=new Thread(clockf()); 
    t.setDaemon(true); 
    t.start(); 
    try { 
     Thread.currentThread().sleep(1000);//60000 

    } catch (InterruptedException e) { 
     System.err.println(e); 
    } 



    } 

,但它不是很好。有沒有辦法讓clockf方法只運行一次/分鐘? 或任何其他方式來使該計時器運行?

回答

5

即使我沒有完全理解你想要做什麼 TimerTimerTask應該爲你做。 以下代碼對改善一點可運,但希望表明的原則:

long minute = 1000*60; 

Timer timer1 = new Timer(); 
long delay1 = 45*minute; 
Timer timer2 = new Timer(); 
long delay2 = 15*minute; 
TimerTask tt1; 
TimerTask tt2; 

... 

tt1 = new TimerTask() 
{ 
    public void run() 
    { 
     //do something and: 
     timer2.schedule(tt2, delay2); 
    } 
}; 

tt2 = new TimerTask() 
{ 
    public void run() 
    { 
     //do something and: 
     timer1.schedule(tt1, delay1); 
    } 
}; 

timer1.schedule(tt1, delay1); 
1

有在你的代碼中的一些重大問題和你的線程類的理解。我假設你想要做的是定義一個你傳遞給線程的Runnable。然而,你實際做的是執行clockf()函數作爲Thread的構造函數的參數。

如果你確實需要一個計時器,看看Java的Timer類: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Timer.html

如果你需要自己編寫,學習Thread類,特別是睡眠的語義和等待。

5

最快的代碼編寫和最容易維護是你根本不寫的東西。

我想看看一個計時器和工作調度程序像石英看看它是否可以幫助你。

0

我解決定時器 的問題,現在我可以用電腦45分鐘,然後暫停所有的幫助15分鐘 許多感謝,並特供kai1968 ^^與本網站http://www.roseindia.net/java/example/java/util/CertainAndRepeatTime.shtml

和任何人都可以告訴我什麼靜態的手段?我真的不知道爲什麼靜態應該在那裏。

import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Timer; 
import java.util.TimerTask; 


public class clock2 { 
    static long minute = 1000*1;//60; 
    static Timer timer1 = new Timer(); 
    static long delay1 = 60*minute; 
    static Timer timer2 = new Timer(); 
    static long delay2 = 45*minute; 
    static TimerTask tt1; 
    static TimerTask tt2; 
    static String s; 

    static String getSecond(){ 
     Calendar calendar = new GregorianCalendar(); 
     int second = calendar.get(Calendar.SECOND); 
     s=Integer.toString(second); 
     return s; 
    } 

    public static void timer(){ 
     tt1=new TimerTask(){ 
      public void run(){ 
       getSecond(); 
       System.out.println(s+"Begin"); 
      } 
     }; 

     tt2=new TimerTask(){ 
      public void run(){ 
       getSecond(); 
       System.err.println(s+"Stop"); 
      } 
     }; 

     timer1.schedule(tt1 ,0,delay1); 
     timer2.schedule(tt2 ,delay2,delay1); 
     } 




    public static void main(String[] args) { 
     timer(); 
    } 
}