【问题标题】:Repeat something after a specific time interval在特定时间间隔后重复某事
【发布时间】:2015-04-29 07:25:59
【问题描述】:

我一直在经历一些关于在特定时间间隔后做某事的 SO 问题(例如每五秒打印一次 hello world)。

我看到了我们可以在 Java 程序中执行此操作的不同方法。我的问题是java如何在内部做到这一点。

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

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

假设我有一个处理器。

【问题讨论】:

  • 它要求操作系统在 5 秒后唤醒它。
  • 行为有保障吗?操作系统肯定会在 5 秒后唤醒它吗?
  • 不,操作系统不能保证在五秒后唤醒您的进程或线程。唯一真正提供这种保证的操作系统是硬实时操作系统:es。即使是软 RT 也不能保证您在五秒后完全醒来。
  • 所以我在程序中所说的 5 秒,可能不是 5 秒的实际时间?

标签: java multithreading time


【解决方案1】:

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

super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
          new DelayedWorkQueue());

要等待下一个任务DelayedWorkQueue 使用Condition available = lock.newCondition()

available.awaitNanos(delay);

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

LockSupport.parkNanos(this, nanosTimeout);

还有LockSUpport

unsafe.park(false, nanos);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多