我经历了一些关于在特定时间间隔之后做某事的问题(比如每五秒打印一次你好世界)。
我在java程序中看到了不同的方法。我的问题是java如何在内部执行此操作。
一旦我们运行java程序,main函数就开始在一个线程中执行。但是这个线程可以随时发送到Runnable状态(暂停执行)。所以如果我在main函数中声明了print语句,java现在如何跟踪时间。如果java程序在接下来的五秒钟内没有恢复怎么办?
这可行的一种方法是,如果我们的意思是"在java程序运行"的时间段内每5秒。这是JVM如何做到的?
假设我有一个处理器。
答案 0 :(得分:0)
好的,让我们跟踪电话。如果我们使用ScheduledThreadPoolExecutor
,我们会发现它在内部使用DelayedWorkQueue
:
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue());
等待下一个任务DelayedWorkQueue
使用Condition available = lock.newCondition()
:
available.awaitNanos(delay);
好的,我们来看看awaitNanos
中的AbstractQueuedSynchronizer
实施:
LockSupport.parkNanos(this, nanosTimeout);
LockSUpport
:
unsafe.park(false, nanos);
这是本机方法,它使用操作系统的调度程序来延迟线程执行。