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