在 main 方法中调用 Thread.sleep 方法,它会暂停哪个线程?

Posted

技术标签:

【中文标题】在 main 方法中调用 Thread.sleep 方法,它会暂停哪个线程?【英文标题】:Thread.sleep method called inside main method, what thread would it pause? 【发布时间】:2021-08-12 04:05:48 【问题描述】:

我对 Thread.sleep() 的工作原理有点困惑:

    如果我在 main 方法中调用它,并且还有其他创建的线程正在运行。它会暂停什么:单独的主线程或其所有子线程(将它们视为主线程的一部分)? 例如:

     public static void main(String arg[])
      
         Thread t1 = new Thread();
         t1.start();
         Thread.Sleep(1000);
     
    

    如果我在线程的run() 方法中调用sleep() 方法,在main 中为线程调用start() 方法时,它是否也会暂停其他线程?因为那发生在我身上......虽然我知道在这种情况下它应该只暂停它在里面调用的线程 例如:

     //thread Tester has a sleep() in its run() while NoSleep doesn't have
      public static void main(String arg[])
       
          Tester t1 = new Tester();
          NoSleep t2 = new NoSleep();
          t1.start();
          t2.start();
     
    

在这样的代码中,t2t1 都会暂停,我不明白为什么。

【问题讨论】:

对于第一部分,我会说它只会让一个线程进入睡眠状态,无论是主线程还是附加线程,因为附加线程将获得不同的堆栈,而主线程只会调用线程而不是控制它,第二情况下只有一个线程应该暂停。 如果您可以指示 其他 个线程休眠,请想象一下混乱。 1.这是一种静态方法。因此它可能只适用于一个线程:当前线程。没有其他任何意义。 2.“t2t1 都暂停”:不,他们没有。 【参考方案1】:

在 Java 中,线程都是平等的,没有分组、父级或所有权。

因此休眠任何一个线程对其他线程没有直接影响。

调用Thread.sleep 会使执行该方法的线程休眠。非常简单,无需解释。

正如Thread.sleep Javadoc 所说:

使当前执行的线程休眠(暂时停止执行)指定的毫秒数


顺便说一句,在现代 Java 中,我们很少需要直接寻址 Thread 类。相反,我们使用执行器服务来执行RunnableCallable 任务。所以无需致电new Thread。并且不需要从Thread扩展。

【讨论】:

【参考方案2】:

Thread.sleep() 暂停正在执行代码的当前线程,它对其他线程没有影响。该线程可以是“主”线程或从主线程产生(启动)的线程。

但是 Thread.sleep() 不是实现异步任务的方法,例如暂停一些线程等待 Thread.sleep() 然后猜测在那段时间之后我可以恢复我的线程并希望事件必须已经完成,您的睡眠线程正在等待。您将使用一些低级机制,例如 notify、wait、notifyAll 。而是按照其他答案中的建议使用信号量、倒计时锁存器和其他更好的包装器。如果您有更多信息或疑问,请在下方评论,乐于提供帮助

【讨论】:

【参考方案3】:

Thread.sleep() 是 Java 中许多名称非常糟糕的事物之一。* 不要认为它会“休眠”任何线程。有一种更简单的思考方式:

Thread.sleep(n) 什么都不做。

它至少在n 毫秒内什么都不做,然后它返回。这就是您需要了解的有关sleep() 的全部信息(至少,在您成为 Java 运行时环境的维护者之前,您需要了解的全部内容。)


* Java 是由几个非常聪明的博士发明的。计算机科学家。 Java 是一门简单、优美的语言;但是他们为某些对专家来说似乎很明显但有时对初学者来说真的很困惑的东西赋予了名字。

【讨论】:

以上是关于在 main 方法中调用 Thread.sleep 方法,它会暂停哪个线程?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 Thread.Sleep():它是让实例化对象的线程休眠,还是让我从中调用方法的线程休眠?

更新 JFrame 并使用 Thread.sleep() [重复]

多线程

NetBeans / Java / 新提示:在循环中调用 Thread.sleep

替代 Thread.Sleep

为啥我必须将每个 Thread.sleep() 调用包装在 try/catch 语句中? [复制]