我们怎样才能让一个线程在java中无限时间睡眠?

时间:2015-06-15 12:45:23

标签: java multithreading thread-sleep

请帮助我理解如何让线程在无限时间内进入睡眠状态。

5 个答案:

答案 0 :(得分:18)

我无法想到这样做的充分理由。正如其中一条评论所述,Long.MAX_VALUE约为2920亿年,因此Thread.sleep(Long.MAX_VALUE)就足够了。但如果你想要一个理论上无限的睡眠解决方案:

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

答案 1 :(得分:8)

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

但在实践 1 中,以下内容将一直处于休眠状态,直到JVM终止...或者线程被中断。

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

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

但坦率地说,让一个线程进入睡眠状态"永远"浪费 2 ,可能是一个坏主意。我毫不怀疑会有更好的方法来实现你真正尝试做的事情。

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

2 - 线程堆栈占用大量内存,并且在线程终止之前无法释放。

答案 2 :(得分:5)

Thread.currentThread().join();

直到JVM被杀死才会睡觉。

答案 3 :(得分:0)

让它等待永远不会释放的互斥锁或资源。这是僵局原则。更好的方法是让线程完成他的代码,因此它将结束而不会再次启动。

编辑: 我不建议使用无限循环,因为它是汇集原则。它将消耗大量资源。

答案 4 :(得分:0)

您可以使用JDK中的类CyclicBarrier

new CyclicBarrier(2).await();

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