java有没有基于自由运行的、与系统时钟无关的时钟停放线程的方法?
要使当前线程在指定的超时时间内停止,我可以使用:
LockSupport.parkNanos(long nanos);
或者
Thread.sleep(long millis);//internally same as Object.wait(long) i guess.
不幸的是,这两种方法的内部时钟都是基于系统时钟的
如果在等待期间(通过ntptime或手动)更改系统时钟,则这些方法将不会作为例外
例如,在t0中,我像线程一样调用这个方法。sleep(dt)至sleep dt秒。 在等待期间,我将系统时钟提前20秒,然后线程将实际休眠dt+20秒
使用以下代码进行检查:
public static void main(String[] args) throws InterruptedException {
long s = System.nanoTime();
int _10sec = 10 * 1000;
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(_10sec));
//or Thread.sleep(_10sec);
long e = System.nanoTime();
long used = e - s;
System.out.println("Used:" + TimeUnit.NANOSECONDS.toMillis(used)); }
使用“date&;sudo date-s 16:10:40”之类的工具,在等待期间将系统时钟提前几分钟,您将从输出中看到发生了什么
这很可悲,因为在我的产品中,很多东西都是基于系统时钟的
例如调度器(最终调用LockSupport.park)通过socket连接进行心跳检测器
如果系统时钟设置得比超时长,调度器会考虑超时,但实际上没有。p>
有谁遇到过同样的麻烦,你怎么解决
编辑:
在我的HA产品中,我使用Watchdog在重负载阻塞系统时杀死操作系统(所谓的自杀策略)。我必须给狗喂食,以防止不必要的自杀,使用螺纹支撑。帕克纳(xxx)将意外自杀
# 1 楼答案
我会做的是让睡眠周期性地醒来,例如每秒钟、每5秒或每分钟。如果需要调整的时间,它可以检查currentTimeMillis(),如果需要单调递增的时间,它可以检查nanoTime()