我知道这对于更多经验丰富的程序员来说可能是完全明显的,但我找不到任何内容。
无论执行的任务有多长,我都需要制作一个每秒“滴答”一次的线程。显然不可能执行比每个刻度花费更长的任务,并且减慢每秒刻度的数量。
感谢。
答案 0 :(得分:3)
使用java.util.Timer.scheduleAtFixedRate
:
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
从指定时间开始,为重复的固定费率执行计划指定的任务。随后的执行大约定期进行,间隔指定的时间段。
在固定速率执行中,每次执行都是相对于初始执行的预定执行时间进行调度的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则会快速连续执行两次或更多次执行以“赶上”。从长远来看,执行频率将恰好是指定时间段的倒数(假设
Object.wait(long)
下的系统时钟是准确的)。由于上述原因,如果计划的第一次是在过去,那么任何“错过的”执行将被安排立即“追赶”执行。固定费率执行适用于对绝对时间敏感的重复活动,例如每小时按小时响铃,或在特定时间每天运行定期维护。它也适用于重复活动,其中执行固定执行次数的总时间很重要,例如倒计时器,每秒钟滴答一次,持续十秒钟。最后,固定速率执行适用于安排必须保持彼此同步的多个重复计时器任务。
答案 1 :(得分:1)
这是Thread
版本。如果您真的想要使用自己的线程,那么Timer
将是可行的方法。
new Thread(new Runnable() {
@Override
public void run() {
try {
long before, sleepDuration, operationTime;
for(int i=0;i<100;i++) {
before = System.currentTimeMillis();
// do your operations
operationTime = (long)(1500*Math.random());
System.out.print("Doing operations for "+operationTime+"ms\t");
Thread.sleep(operationTime);
// sleep for up to 1000ms
sleepDuration = Math.min(1000, Math.max(1000 - (System.currentTimeMillis() - before), 0));
Thread.sleep(sleepDuration);
System.out.println("wait\t"+sleepDuration+"ms =\telapsed " + (operationTime+sleepDuration) + (operationTime > 1000 ? "<" : ""));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
答案 2 :(得分:0)
Timer
和TimerTask
类非常适合您使用。
查看文档http://docs.oracle.com/javase/6/docs/api/index.html?java/util/Timer.html或按照本课程http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html
如果我误解了你的问题,请告诉我。