我们如何让线程在 java 中无限期休眠?

How can we make a thread to sleep for a infinite time in java?

请帮助我了解如何让线程无限期休眠。

我想不出这样做的充分理由。正如其中一条评论所指出的,Long.MAX_VALUE 大约是 2920 亿年,所以 Thread.sleep(Long.MAX_VALUE) 可能就足够了。但是如果你想要一个理论上的无限睡眠解决方案:

while (true) {
    Thread.sleep(Long.MAX_VALUE);
}

让它等待永远不会释放的互斥体或资源。这就是死锁原则。更好的方法是让线程执行完他的代码,这样它就结束了,不会再启动了。

编辑: 我不推荐无限循环,因为它是池化原则。白白消耗大量资源

从字面上看,你不能。没有 Java 应用程序可以 运行 无限长的时间。硬件会先死:-)

但实际上1,下面会休眠直到JVM终止...或者线程被中断

 public void freeze() throws InterruptedException {
    Object obj = new Object();
    synchronized (obj) {
        obj.wait();
    }
 }

如果您愿意,可以在 while (true) 循环中捕获异常。用 "sleep(max int)" 做同样的事情是等价的。

但坦率地说,让线程休眠 "for ever" 是一种浪费2,而且可能是个坏主意。我毫不怀疑会有更好的方法来实现你真正想要做的事情。


1 - 我谈到的这些解决方案适用于线程需要让自己进入休眠状态的情况。如果一个线程 单方面 让另一个线程进入休眠状态,它就不能安全地做到这一点。您可以使用已弃用的 Thread.suspend() 方法,但它很危险,并且在未来的 Java 平台上可能不可用。

2 - 线程堆栈占用大量内存,直到线程终止才能释放。

Thread.currentThread().join();

将休眠直到 JVM 被终止。

您可以使用 JDK 中的 class CyclicBarrier

new CyclicBarrier(2).await();

构造函数参数是在达到屏障之前必须调用 await 方法的线程数。