当前位置: 首页 > 面试题库 >

Thread.sleep()实现

孙洋
2023-03-14
问题内容

今天,我有一个采访上,我问候选人很平常和基本的问题有关的区别Thread.sleep()Object.wait()。我以为他会回答类似这样的,但他说,这些方法基本上是一样的,而且极有可能Thread.sleep是用Object.wait()在它里面,但sleep本身并不需要外部锁。这不是完全正确的答案,因为在JDK
1.6中此方法具有以下签名。

public static native void sleep(long millis) throws InterruptedException;

但是我的第二个想法是,这不是那么可笑。可以使用定时等待来达到相同的效果。看一下以下代码片段:

public class Thread implements Runnable {
       private final Object sleepLock = new Object();

     // other implementation details are skipped

       public static void sleep(long millis) throws InterruptedException {
            synchronized (getCurrentThread().sleepLock){
                getCurrentThread().sleepLock.wait(millis);
            }
        }

在这种情况下sleepLock,一个对象特别用于同步块内部sleep方法。我假设Sun /
Oracle工程师知道Occam的剃须刀,因此sleep本机实现是故意的,所以我的问题是为什么它使用本机调用。

我想到的唯一想法是假设某人可能会找到有用的调用,例如Thread.sleep(0)。根据本文,对调度程序管理很有意义:

这具有清除当前线程的数量并将其放在优先级级别的队列末端的特殊效果。换句话说,具有相同优先级的所有可运行线程(以及具有更高优先级的那些线程)将有机会在下一个给定的CPU时间之前让产生的线程运行。

因此,synchronized块将产生不必要的开销。

您是否知道在Thread.sleep()执行中不使用定时等待的其他原因?


问题答案:

可以很容易地说Occam的Razor削减了另一种方式。假定大多数情况下,基于Java的JDK的JVM的正常/预期实现都是将Java“线程”绑定到本机线程上,并且使线程处于休眠状态是基础平台的基本功能。如果无论如何线程代码都是本地的,为什么还要在Java中重新实现它?最简单的解决方案是使用已经存在的功能。

其他一些注意事项:在现代JVM中,无争议的同步可以忽略不计,但并非总是如此。过去,获取该对象监视器是一项相当“昂贵”的操作。

如果在Java代码中实现线程休眠,并且实现方式也未绑定到本机线程等待,则操作系统必须继续调度该线程,以便运行检查是否需要唤醒的代码。正如注释中所散列的那样,对于现代JVM上的示例而言,这显然不是正确的,但是很难说1)首次以这种方式指定Thread类时可能已经存在并期望发生什么。2)如果该断言适用于每个平台,则可能有人曾经想在其上实现JVM。



 类似资料:
  • 问题内容: 目标:偶尔执行某些代码。 问题:就性能而言,以下各项之间是否存在重大差异: 和 ? 当然,后一种选择更适合犹太人。但是,我想知道是否应该进行一次冒险,即“花几天时间重构遗留代码以告别Thread.sleep()”。 更新:此代码在超级/大型/超级高负载环境中运行。 问题答案: 您正在处理以数十秒为单位的睡眠时间。通过在此处更改睡眠选项可能节省的时间可能是纳秒或微秒。 我每次都更喜欢后一

  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对

  • 问题内容: 这是一个片段 我正在使用和作为文本框。文本框应显示“ Hello”,然后等待一秒钟,但是,当我尝试执行此操作时,它会等待一秒钟,然后放置“ Hello”一词,这不是我想要的。 我不确定为什么会这样,因为我将其按逻辑顺序放置。如果有人可以帮助我,那就太好了。 编辑: 有谁知道替代方案,所以我可以使用“延迟”效果吗? 问题答案: 永远不要从Swing事件线程中调用Thread.sleep(

  • 问题内容: 如果我要打个电话让Java Thread进入睡眠状态,是否有理由偏爱其中一种而不是另一种? 要么 问题答案: 会打电话给。唯一的区别是可读性,在不明显的持续时间内使用(例如:vs .)可能更容易理解。 供参考,请参见以下in 中的代码:

  • 问题内容: 我需要将while循环暂停特定的毫秒数。我尝试使用,但是它不准确,尤其是在循环场景中。毫秒精度在我的程序中很重要。 这是我不希望在expectedElapsedTime通过之前检查条件的算法。 问题答案: 你能指望什么? 如果您进入睡眠状态,则一旦您的进程再次可运行,就必须等待线程调度程序再次对其进行调度。 我的意思是如果您进入睡眠状态50秒钟,这并不意味着您的进程将在完全50秒钟内运

  • 问题内容: 建议使用哪些方法来加快测试速度。 当连接断开或发生超时错误等时,我正在测试具有重试功能的网络库。但是,该库在重试之间使用a (因此在服务器重新启动时它不会连接数千次)。这个电话大大降低了单元测试的速度,我想知道有什么方法可以覆盖它。 请注意,我愿意实际更改代码,或使用模拟框架模拟Thread.sleep(),但想先听听您的意见/建议。 问题答案: 通常将与时间相关的功能委托给单独的组件