1 原理:启动一个线程来刷时间,缺点是不太精确,可能跟线程的优先级有关系。
会有0-10ms的误差。精确到0.1s是没有问题的。
package
timer;

public
class
Timer
...
{
private long interval;
// private boolean enabled;
private Task task;
private Clock clock;

public Timer(long _interval, Task _task) ...{
super();
this.interval = _interval;
// this.enabled = enabled;
this.task = _task;
clock = new Clock();
clock.start();

new Thread(new Runnable() ...{

public void run() ...{
boolean b = true;

while (b) ...{
//System.out.println(clock.getCurrTime());

if (interval <= clock.getCurrTime()) ...{
System.out.println(clock.getCurrTime());
task.doit();
clock.setCurrTime(0);
//clock.stop();
//System.out.println(clock.getCurrTime());
//b = false;
}
}
}
}).start();
}

public Task getTask() ...{
return task;
}

public long getInterval() ...{
return interval;
}
// public boolean isEnabled() {
// return enabled;
// }
// public void setEnabled(boolean enabled) {
// this.enabled = enabled;
// }
}
package
timer;

public
class
Clock
extends
Thread
...
{
private long oldTime;
private long currTime;

public Clock() ...{
oldTime = System.currentTimeMillis();
currTime = 0;
}

public long getCurrTime() ...{
return currTime;
}
@Override
public void run() ...{

while (true) ...{
currTime = System.currentTimeMillis() - oldTime;
}
}

public void setCurrTime(long currTime) ...{
this.currTime = currTime;
}
}
package
timer;

public
interface
Task
...
{
void doit();
}
package
timer;

public
class
NewTask
implements
Task
...
{

public void doit() ...{
System.out.println( System.currentTimeMillis() );
}
}
package
timer;

public
class
Test
...
{

/** *//**
* @param args
*/
public static void main(String[] args) ...{
Task task = new NewTask();
Timer t = new Timer(1000,task);
}
}
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1660778
本文介绍了一个简易的线程定时器实现方案。通过启动一个线程来不断更新当前时间,并与设定的时间间隔进行比较,当到达指定间隔时触发任务执行。该方案能够实现0.1秒级别的定时精度。
1万+

被折叠的 条评论
为什么被折叠?



