请帮助我理解如何让一个线程无限长的休眠。
0h4hbjxa1#
我想不出这样做的好理由。正如一条评论所指出的那样,Long.MAX_VALUE大约是2920亿年,所以可能Thread.sleep(Long.MAX_VALUE)就足够了。但是如果你想要一个理论上的无限睡眠解决方案:
Thread.sleep(Long.MAX_VALUE)
while (true) { Thread.sleep(Long.MAX_VALUE); }
yzuktlbb2#
从字面上看,你不能。没有Java应用程序可以无限长时间运行。硬件将首先死亡:-)但是在practice 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 -线程堆栈占用大量内存,并且在线程终止之前无法释放。
while (true)
Thread.suspend()
up9lanfz3#
Thread.currentThread().join();
会一直休眠直到JVM被杀死。
yi0zb3m44#
让它等待一个永远不会被释放的互斥锁或资源。这是死锁原理。更好的方法是让线程完成他的代码,这样它就会结束而不会再被启动。编辑:我不推荐无限循环,因为这是池化原则。它会白白消耗大量资源。
7ivaypg95#
您可以使用JDK中的类CyclicBarrier。
new CyclicBarrier(2).await();
构造函数参数是在到达屏障之前必须调用await方法的线程数。
await
mwkjh3gx6#
其实很简单,如果你这样做:
public static boolean timerController = false; Timer timer = new Timer(); public TimerTask task = new TimerTask() { public void run() { if(timerController == false){ tracker(); t.setText("<html><br/>Day " + day + ", hour " + hour + "<br/>"); System.out.println("Hour: " + hour + " Day: " + day + " Real time seconds " + realTime + " Seconds");} } }; public void start() { timer.scheduleAtFixedRate(task, 1000, 1000); } public void pause(){ timerController = true; } public void resume(){ timerController = false; }
在另一个类中创建一个计时器对象,并使用三个方法简单地启动,暂停和恢复。当你暂停计时器时,它应该“停止”,并且你不需要处理任何异常处理或任何try/catch语句!
ctrmrzij7#
就做一个无限循环
while(true){}
7条答案
按热度按时间0h4hbjxa1#
我想不出这样做的好理由。正如一条评论所指出的那样,Long.MAX_VALUE大约是2920亿年,所以可能
Thread.sleep(Long.MAX_VALUE)
就足够了。但是如果你想要一个理论上的无限睡眠解决方案:yzuktlbb2#
从字面上看,你不能。没有Java应用程序可以无限长时间运行。硬件将首先死亡:-)
但是在practice 1中,下面的代码将一直处于休眠状态,直到JVM终止...或者线程被中断。
如果你愿意的话,你可以在
while (true)
循环中捕获异常。同样的,用“sleep(max int)”也是一样的。但是坦率地说,让一个线程“永远”进入睡眠状态是一种浪费,而且可能是一个坏主意。我毫不怀疑会有更好的方法来实现你真正想做的事情。
1 -我所说的这些解决方案是当一个线程需要让自己进入睡眠状态时的解决方案。如果你让一个线程单方面让另一个线程进入睡眠状态,它就不能安全地做到这一点。你可以使用已弃用的
Thread.suspend()
方法,但它很危险,而且它可能在未来的Java平台上不可用。2 -线程堆栈占用大量内存,并且在线程终止之前无法释放。
up9lanfz3#
会一直休眠直到JVM被杀死。
yi0zb3m44#
让它等待一个永远不会被释放的互斥锁或资源。这是死锁原理。更好的方法是让线程完成他的代码,这样它就会结束而不会再被启动。
编辑:我不推荐无限循环,因为这是池化原则。它会白白消耗大量资源。
7ivaypg95#
您可以使用JDK中的类CyclicBarrier。
构造函数参数是在到达屏障之前必须调用
await
方法的线程数。mwkjh3gx6#
其实很简单,如果你这样做:
在另一个类中创建一个计时器对象,并使用三个方法简单地启动,暂停和恢复。当你暂停计时器时,它应该“停止”,并且你不需要处理任何异常处理或任何try/catch语句!
ctrmrzij7#
就做一个无限循环