我需要一种以独立于系统时钟的方式暂停/休眠线程的方法。这意味着,如果我希望线程在dT msecs中弱化,那么如果系统时间在此期间发生显着变化,它也必须这样做。我对msecs的准确性并不是那么感兴趣,而且原则上它更有效。
TimerTasks不是一个选项,因为它们可以在绝对时间内工作。
答案 0 :(得分:1)
答案 1 :(得分:1)
棘手......很难知道系统时钟是否被用于任何给定的策略。但是,避免使用时钟是因为在线程暂停期间可能会更改时间,但 System.nanoTime() 与当前时间无关,因为它纯粹是自JVM启动以来的纳秒数。因此,如果暂停策略使用nanos,则可以假设暂停时段将通过系统时钟时间变化保持准确性。也许Thread.join(0,nanos)在循环中调用:
public static void pause(long ms) throws InterruptedException {
long final ZERO = 0L;
int final MAX_NANOS = 999999;
for(int i = 0; i < ms+1; i++) {
Thread.currentThread().join(ZERO, MAX_NANOS);
}
}
我没有测试系统时钟的变化,但似乎在.004%的偏差范围内运行。
答案 2 :(得分:0)
我不确定我是否理解你的问题。如果您需要任务计划程序,Quartz非常好。如果你真的想暂停一个任意线程x的时间比这更麻烦。