Java 在特定的时间间隔后重复某事

Java 在特定的时间间隔后重复某事,java,multithreading,time,Java,Multithreading,Time,我一直在讨论一些关于在特定时间间隔后做某事的问题(比如每五秒钟打印一次hello world) 我在java程序中看到了不同的方法。我的问题是java如何在内部实现这一点 一旦我们运行java程序,主函数就开始在线程中执行。但是这个线程可以随时被发送到可运行状态(暂停执行)。因此,如果我在main函数中声明了print语句,那么java现在如何跟踪时间呢。如果java程序在接下来的五秒钟内没有恢复会怎么样 一种可行的方法是,如果我们的意思是“在java程序运行的时间段内每5秒一次”。JVM就是这

我一直在讨论一些关于在特定时间间隔后做某事的问题(比如每五秒钟打印一次hello world)

我在java程序中看到了不同的方法。我的问题是java如何在内部实现这一点

一旦我们运行java程序,主函数就开始在线程中执行。但是这个线程可以随时被发送到可运行状态(暂停执行)。因此,如果我在main函数中声明了print语句,那么java现在如何跟踪时间呢。如果java程序在接下来的五秒钟内没有恢复会怎么样

一种可行的方法是,如果我们的意思是“在java程序运行的时间段内每5秒一次”。JVM就是这样做的吗


假设我有一个单处理器。

好的,让我们跟踪呼叫。如果我们使用的是
ScheduledThreadPoolExecutor
,我们可以发现它在内部使用了
DelayedWorkQueue

super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
          new DelayedWorkQueue());
要等待下一个任务,请使用
条件available=lock.newCondition()

好的,让我们看看
AbstractQueuedSynchronizer
中的
awaitNanos
实现:

LockSupport.parkNanos(this, nanosTimeout);
以及
锁支持

unsafe.park(false, nanos);

这是一种本机方法,它使用操作系统的调度程序延迟线程执行。

它要求操作系统在5秒后将其唤醒。这种行为有保证吗?操作系统会在5秒后唤醒它吗?不,操作系统不能保证在5秒后唤醒进程或线程。唯一真正提供这种保证的操作系统是硬实时操作系统。即使是软RT也不能保证你在5秒后完全醒来。所以我在程序中所指的5秒,可能不是5秒的实际时间?
unsafe.park(false, nanos);