Java如何编写计时器

时间:2010-06-23 09:14:34

标签: java

我想在java.which中编写一个计时器,它将执行以下操作: 程序启动时,启动计时器1,计时器将在45分钟后停止,同时启动第二个计时器,15分钟后停止计时器。此时第一个计时器将再次启动,并重复上述循环直到程序退出 第一个计时器:45分钟(我可以使用计算机的时间) 第二个计时器:15分钟(暂停时间) 第一个计时器:45分钟(我可以使用计算机的时间) 第二个计时器:15分钟(暂停时间) 第一个计时器:45分钟(我可以使用计算机的时间) 第二个计时器:15分钟(暂停时间)

我不知道如何使用线程和计时器(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方法只运行一次/分钟? 或任何其他方式使该计时器运行?

4 个答案:

答案 0 :(得分: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 :(得分:5)

最快的代码编写和最容易维护是你根本不写的东西。

我会研究像Quartz这样的计时器和作业调度程序,看看它是否可以帮到你。

答案 2 :(得分:1)

您的代码中存在一些主要问题以及您对Thread-classes的理解。我假设你要做的是定义一个传递给线程的Runnable。但是,您实际执行的是将clockf()函数作为Thread构造函数的参数执行。

如果确实需要定时器,请查看Java-Timer类: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Timer.html

如果您需要自己编写,请研究Thread类,特别是睡眠和等待的语义。

答案 3 :(得分:0)

我用Timer解决了这个问题 现在我可以使用电脑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();
    }
}