Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保在线程中经过固定时间后执行?_Java - Fatal编程技术网

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

Java 如何确保在线程中经过固定时间后执行?,java,Java,我在并发性和计划执行方面有问题。我正在尝试实现我自己的线程时钟(用于快进模拟),它应该每5秒增加一个计数器。现在我了解到线程可能会被阻止或被调度程序任意分配执行时间,因此我无法保证计数器每5秒增加一次,我如何解决这个问题?您无法确保计数器在恰好5秒后增加 如果您使用ScheduledExecutorService,它可以保证您的计数器在5秒后(但不是更早)增加 您可以使用Java,下面是一个示例: import java.util.Date; import java.util.Timer; im

我在并发性和计划执行方面有问题。我正在尝试实现我自己的线程时钟(用于快进模拟),它应该每5秒增加一个计数器。现在我了解到线程可能会被阻止或被调度程序任意分配执行时间,因此我无法保证计数器每5秒增加一次,我如何解决这个问题?

您无法确保计数器在恰好5秒后增加

如果您使用
ScheduledExecutorService
,它可以保证您的计数器在5秒后(但不是更早)增加

您可以使用Java,下面是一个示例:

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。我不认为你能得到绝对精度,无论你使用什么。

我认为
计数器
应该声明为
volatile
@dodgycodecoexception,但这只是一个例子。
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();
        }
    }

}