繁体   English   中英

我们怎样才能让一个线程在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)”做同样的事情也是等价的。

但坦率地说,让一个线程“永远”睡觉是浪费2 ,可能是一个坏主意。 我毫不怀疑会有更好的方法来实现你真正想做的事情。


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

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

Thread.currentThread().join();

将睡到JVM被杀死。

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

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

您可以使用JDK中的CyclicBarrier类。

new CyclicBarrier(2).await();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM