2010-06-23 56 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(); 
    } 
}