我可以用等待而不是睡觉吗?

njz*_*zk2 8 java multithreading

我遇到了一个问题,其中海报试图让一个线程等待一秒钟.他们正在使用wait,但在一个synchronized街区之外,因此它崩溃了.

给定一个正在运行的线程,暂停执行给定时间,可以执行以下操作:

Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)

这应该也可以,并且具有非常相似的结果:

synchronized(this) {
    this.wait(1000);
}
Run Code Online (Sandbox Code Playgroud)

使用wait超时,线程将在1秒后取消暂停.

问题是:如果我没有任何监控和通知问题,是否有实际的理由使用一个而不是另一个?

And*_*gin 5

双方sleep()wait()用来把当前线程搁置,但他们设计不同的使用情况:

sleep()通常在您确切知道线程处于非活动状态的时间时使用.在给定的超时后,它将自动唤醒,不受外界干扰.如果发生紧急事件,有人可能会决定早点唤醒你的线程(在这种情况下,呼叫最终sleep()会以a结束InterruptedException).例如,用户决定在线程处于睡眠状态时关闭应用程序,或类似的事情.

所以,sleep()就像设置一个闹钟,在打瞌睡的同时唤醒你一小时.但是有人可以早点叫醒你说这座建筑物着火了,最好起床并做些什么.

wait()另一方面,它被设计为保持一个线程,直到将来某个时候发生某些事情.你不知道需要多长时间.必须有外面的人通过调用notify()notifyAll()在监视器上唤醒线程(在用于调用的同一对象上wait()).例如,一个线程已将某个作业委托给另一个线程,并希望在作业完成之前休眠.您还可以选择限制等待时间,但线程将无法继续执行,直到它可以重新获取监视器.等待线程仍然可以像中断一样中断sleep().

所以,wait()就像你在车间里有唯一的螺丝刀,把它借给你的同事一段时间,并决定打瞌睡,直到他或她完成.当你的螺丝刀再次空闲时你要求他们叫醒你,你可以继续工作.你也可以设置一个闹钟sleep(),但是在你拿回螺丝刀之前你将无法恢复工作.

当然,这些只是使用这些方法的常用简单方法.您可以根据其功能设计自己的使用方案.


Nai*_*ili 0

javadoc中的区别非常明显:

void Object.wait():导致当前线程等待,直到另一个线程调用该对象的notify()方法或方法。notifyAll()

void Object.wait(long timeout):导致当前线程等待,直到另一个线程调用该notify()方法或notifyAll()该对象的方法,或者经过指定的时间。

static void Thread.sleep(long millis):使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性。

否则,将在此处提出问题并得到解释的答案 。