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秒后取消暂停.
问题是:如果我没有任何监控和通知问题,是否有实际的理由使用一个而不是另一个?
双方sleep()并wait()用来把当前线程搁置,但他们设计不同的使用情况:
sleep()通常在您确切知道线程处于非活动状态的时间时使用.在给定的超时后,它将自动唤醒,不受外界干扰.如果发生紧急事件,有人可能会决定早点唤醒你的线程(在这种情况下,呼叫最终sleep()会以a结束InterruptedException).例如,用户决定在线程处于睡眠状态时关闭应用程序,或类似的事情.
所以,sleep()就像设置一个闹钟,在打瞌睡的同时唤醒你一小时.但是有人可以早点叫醒你说这座建筑物着火了,最好起床并做些什么.
wait()另一方面,它被设计为保持一个线程,直到将来某个时候发生某些事情.你不知道需要多长时间.必须有外面的人通过调用notify()或notifyAll()在监视器上唤醒线程(在用于调用的同一对象上wait()).例如,一个线程已将某个作业委托给另一个线程,并希望在作业完成之前休眠.您还可以选择限制等待时间,但线程将无法继续执行,直到它可以重新获取监视器.等待线程仍然可以像中断一样中断sleep().
所以,wait()就像你在车间里有唯一的螺丝刀,把它借给你的同事一段时间,并决定打瞌睡,直到他或她完成.当你的螺丝刀再次空闲时你要求他们叫醒你,你可以继续工作.你也可以设置一个闹钟sleep(),但是在你拿回螺丝刀之前你将无法恢复工作.
当然,这些只是使用这些方法的常用简单方法.您可以根据其功能设计自己的使用方案.
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |