如何确保在线程中固定时间后执行?

时间:2018-10-30 13:56:56

标签: java

我在并发性和计划执行方面存在问题。我正在尝试实现自己的线程时钟(用于快速前进的仿真目的),该时钟应该每5秒精确地增加一个计数器。现在我知道线程可能会被调度程序阻塞或被分配给执行时间,所以我不能保证计数器每五秒钟增加一次,我该如何解决呢?

2 个答案:

答案 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);