我在并发性和计划执行方面存在问题。我正在尝试实现自己的线程时钟(用于快速前进的仿真目的),该时钟应该每5秒精确地增加一个计数器。现在我知道线程可能会被调度程序阻塞或被分配给执行时间,所以我不能保证计数器每五秒钟增加一次,我该如何解决呢?
答案 0 :(得分:1)
您可以使用Java Timer,下面是一个示例:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTaskExample extends TimerTask {
private volatile int counter;
public int getCounter() {
return counter;
}
@Override
public void run() {
System.out.println("Start time:" + new Date());
doSomeWork();
System.out.println("End time:" + new Date());
}
private void doSomeWork() {
counter++;
System.out.println("Counter: " + counter);
}
public static void main(String args[]) {
TimerTaskExample timerTask = new TimerTaskExample();
// running timer task as daemon thread
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 5 * 1000);
System.out.println("TimerTask begins! :" + new Date());
// cancel after sometime
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled! :" + new Date());
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
关于准确性,请阅读所使用的schedule
方法的Javadoc。我认为无论您使用什么,都无法获得绝对的精度。
答案 1 :(得分:0)
您无法确保在准确 5秒后将计数器增加。
如果您使用ScheduledExecutorService
,则可以保证您的计数器会在5秒后(但不能更早)在某个时候递增。
AtomicLong counter = new AtomicLong();
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(() -> counter.incrementAndGet(), 5, TimeUnit.SECONDS);