timer内部有TimerTask。TimerTask可以取消cancel()。取消了,但是还在timer内部。
timerpurge()移除取消了的任务。
所以 最好 cancel 之后调用 purge 然后 置空timer timer =null;
不调用timercancel(),timerTask线程会一直被执行,
调用timercancel(),timerTask也会执行完当次之后结束。
最好
if(timer!=null){
timercancel();
timerpurge();
timer=null;
}
用Timer类好一些。
--------------------------------------------------------------------------------
import javautilCalendar;
import javautilDate;
import javautilTimer;
import javautilTimerTask;
public class Main {
public static void main(String[] args) {
Calendar taskTime = CalendargetInstance();
taskTimeset(CalendarMONTH, 11);
taskTimeset(CalendarDATE, 31);
taskTimeset(CalendarHOUR, 22);
taskTimeset(CalendarMINUTE, 00);
Calendar now = CalendargetInstance();
if (taskTimeafter(now)) {
// 任务时间在当前时间之后,设置当年 12/31 22:00执行
new Timer()schedule(new MyTask(taskTime), taskTimegetTime());
} else if (taskTimeget(CalendarYEAR) == nowget(CalendarYEAR)) {
// 任务时间在当前时间之前,并且是同一年,执行一次
new Timer()schedule(new MyTask(taskTime), new Date());
} else {
//
taskTimeadd(CalendarYEAR, nowget(CalendarYEAR));
new Timer()schedule(new MyTask(taskTime), taskTimegetTime());
}
}
}
class MyTask extends TimerTask {
private Calendar taskTime = null;
public MyTask(Calendar taskTime) {
thistaskTime = taskTime;
}
public void run() {
// 你要执行的
Systemoutprintln("hello");
// 年+1
taskTimeadd(CalendarYEAR, 1);
new Timer()schedule(new MyTask(taskTime), taskTimegetTime());
}
}
我swing差不多都忘了,你的00控制用DecimalFormat这个类,可以参考JDK中文帮助文档关于它的方法;
DecimalFormat format = new DecimalFormat("00");
String abc ="1";
String a = formatformat(abc)toString();
Systemoutprintln(a);
不用GUI的思路:
实例化一个DecimalFormat的对象f,定义小时分秒为三个字符串变量;
从秒开始,用for循环,循环体是{秒++;if(秒==60){分+=1;秒=0}if(分==60){小时+=1;分=0}if(小时==24){小时=0},Systemoutprint(fformat(小时) + “:”+fformat(分) “:”+fformat (秒));Systemoutprint("\r");这个\r是光标移动到小时第一个数字前面,以至于时间循环覆盖造成原位置变化的效果。ThreadSleep(1000);这个是1秒间隔的设置注意导入Thread类}
这个思路已经完成了代码的90%了,剩下的是你自己根据这个思路边查看JDK边写程序,如果直接给你代码会害了你。用GUI效果就是把Systemoutprint改成类似textsetText();
java代码运行时要消耗多少时间的测量方法:
定义一个起始时间:
long start = SystemcurrentTimeMillis();
//这里是你要执行的程序块。。。。
定义一个结束时间
long end = SystemcurrentTimeMillis();
程序快执行耗时=start-end;
import javaawtColor;
import javautil;
import javaawt;
import javaapplet;
public class Clock extends Applet implements Runnable
{
Thread timer=null;
Label label;
int lastxs=50,lastys=30,lastxm=50,lastym=30,lastxh=50,lastyh=30;
public void init()
{
label=new Label(" ");
setBackground(Colorwhite);
add(label);
}
public void paint(Graphics g)
{
int xh,yh,xm,ym,xs,ys,s,m,h,xcenter,ycenter;
Date rightnow=new Date();
String today=rightnowtoLocaleString();
labelsetText(today);
s=rightnowgetSeconds();
m=rightnowgetMinutes();
h=rightnowgetHours();
xcenter=100;
ycenter=80;
xs=(int)(Mathcos(s314f/30-314f/2)45+xcenter);
ys=(int)(Mathsin(s314f/30-314f/2)45+ycenter);
xm=(int)(Mathcos(m314f/30-314f/2)45+xcenter);
ym=(int)(Mathsin(m314f/30-314f/2)45+ycenter);
xh=(int)(Mathcos((h30+m2)314f/180-314f/2)30+xcenter);
yh=(int)(Mathsin((h30+m2)314f/180-314f/2)30+ycenter);
gsetFont(new Font("TimesToman",FontPLAIN,14));
gsetColor(Colororange);
gfill3DRect(xcenter-50,ycenter-50,100,100,true);
gsetColor(ColordarkGray);
gdrawString("12",xcenter-5,ycenter-37);
gdrawString("3",xcenter+40,ycenter+3);
gdrawString("6",xcenter-3,ycenter+45);
gdrawString("9",xcenter-45,ycenter+3);
gsetColor(Colororange);
if(xs!=lastxs||ys!=lastys)
{
gdrawLine(xcenter,ycenter,lastxs,lastys);
}
if(xm!=lastxm||ym!=lastym)
{
gdrawLine(xcenter,ycenter-1,lastxm,lastym);
gdrawLine(xcenter-1,ycenter,lastxm,lastym);
}
if(xh!=lastxh||yh!=lastyh)
{
gdrawLine(xcenter,ycenter-1,lastxh,lastyh);
gdrawLine(xcenter-1,ycenter,lastxh,lastyh);
}
gsetColor(Colorred);
gdrawLine(xcenter,ycenter,xs,ys);
gdrawLine(xcenter,ycenter-1,xm,ym);
gdrawLine(xcenter-1,ycenter,xm,ym);
gdrawLine(xcenter,ycenter-1,xh,yh);
gdrawLine(xcenter-1,ycenter,xh,yh);
lastxs=xs;
lastys=ys;
lastxm=xm;
lastym=ym;
lastxh=xh;
lastyh=yh;
}
public void start()
{
if(timer==null)
{
timer=new Thread(this);
timerstart();
}
}
public void stop()
{
timer=null;
}
public void run()
{
while(timer!=null)
{
try
{
Threadsleep(1000);
}catch(InterruptedException ie){}
repaint();
}
timer=null;
}
public void update(Graphics g)
{
paint(g);
}
}
以上就是关于java关于Timer计时器的问题求解全部的内容,包括:java关于Timer计时器的问题求解、java 时钟(计时器) 每年年底最后一天(22:00) 执行一次(调用相应的方法)、Java计时器问题 现在程序是从系统当前时间开始计时 我想修改为从00:00:00开始计时 怎么弄呀(其它不变)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)