我想在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方法只运行一次/分钟? 或任何其他方式使该计时器运行?
答案 0 :(得分:5)
即使我没有完全理解你想要做什么 Timer和TimerTask应该为您做到这一点。 以下代码必须改进一点才能运行,但希望显示原则:
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();
}
}