Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,我们如何使线程无限期地休眠?_Java_Multithreading_Thread Sleep - Fatal编程技术网

在java中,我们如何使线程无限期地休眠?

在java中,我们如何使线程无限期地休眠?,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,请帮助我了解如何让一根线在无限长的时间内睡眠 我想不出这样做的好理由。正如其中一条评论所指出的,Long.MAX\u值大约是2920亿年,所以可能Thread.sleep(Long.MAX\u值)就足够了。但如果你想要一个理论上的无限睡眠解决方案: while (true) { Thread.sleep(Long.MAX_VALUE); } 让它等待一个永远不会释放的互斥锁或资源。这是死锁原则。更好的方法是让线程完成他的代码,这样它将结束而不会再次启动 编辑: 我不推荐无限循环,因为这

请帮助我了解如何让一根线在无限长的时间内睡眠

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

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)”也同样如此

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


1-我谈论的这些解决方案是针对线程需要使自己进入睡眠状态的情况。如果你用一个线程单方面地让另一个线程进入睡眠状态,它就不能安全地这样做。您可以使用不推荐使用的
Thread.suspend()
方法,但这很危险,而且在未来的Java平台上可能无法使用

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

将一直休眠,直到JVM被杀死。

您可以使用JDK中的类

new CyclicBarrier(2).await();

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

为什么要这样做?
Thread.sleep(Long.MAX_值)不是无限的,但仍然足够长,以至于你看不到它的结尾…使用无限循环,但是,为什么你需要它?为了什么?这是一个灾难的处方-是的@assylias给了你接近无限的东西。你问错了问题。这是一个XY问题。正确的问题可能更像是“如何让一个线程等待另一个线程完成?”之类的问题如果我们将线程休眠很长时间,那么池并不坏。我同意,但是像while(true){}或for(;;){}这样的池非常坏。这个实现将在2920亿年后醒来,然后再次休眠,我不会在生产中使用它,因为2920亿年远小于无限期。想象一下,到那时我的继任者将需要提供什么样的支持。@IbrahimArief除非在2920亿年内真是假,否则它将再次入睡(如果在此期间没有发生任何异常;-)。多么骇客:想想所有浪费在循环上的CPU时间吧!对但是,他们可能会更改JVM,从而使这个病态案例引发异常。(只是说说而已)。
new CyclicBarrier(2).await();