有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

  1. # 1 楼答案

    我会做的是让睡眠周期性地醒来,例如每秒钟、每5秒或每分钟。如果需要调整的时间,它可以检查currentTimeMillis(),如果需要单调递增的时间,它可以检查nanoTime()