正如问题所示,我想知道线程上sleep和join方法之间的相似性。我已经经历了许多描述睡眠和连接方法之间差异的问题。但我想知道睡眠和连接方法可以互换使用的不同场景。根据我的想法,下面的代码应该以同样的方式工作。我有一个主线程,我在其中启动一个新线程(只有1),我希望主线程等待新线程完成一段时间。代码如下:
newThread.join(10000)
或,
Thread.sleep(10000)
但是,当我运行此代码时,我没有得到预期的结果。为什么会这样?技术上它应该是一样的吗?
答案 0 :(得分:6)
否否否
sleep
和join
完全不同。
join
将等待指定的Thread
完成(正常或异常)或直到时间到期。
sleep
将在指定时间内停止当前线程。
他们完全不同。一个显式等待另一个Thread
并唤醒即时,Thread
结束。 sleep
只是停止执行。
如果保证比newThread
需要更长时间10,000ms
才能完成,那么它们就会变得相同,但这是一种堕落的情况。
如果您想等待其他Thread
完成使用join
。
如果您希望当前Thread
停止正在进行的操作并暂停一段时间sleep
。
答案 1 :(得分:1)
我不清楚你的实际问题是什么,但你的第三句话说:“我想知道睡眠和连接方法可以互换使用的不同场景。”
从实际的角度来看,如果您与编写生产代码的软件开发人员团队合作,那么会有 no 场景,其他开发人员会允许您使用join(long)作为睡觉的替代方案(长)。没有办法,没有办法!在某些情况下,它实际上会起作用并不重要。
生产代码应该是可读的。代码的意图对其他人来说应该是显而易见的。它应该遵循最低惊喜原则(参见清洁代码:Robert C. Martin的敏捷软件工艺手册)。这意味着,当你写foobar.join(n)时,你应该期望foobar线程死掉。您可能已准备好处理超时情况,但这应该是例外,而不是规则。没有其他正当理由可以调用join(n)。其他任何东西都是“黑客”,我们不会在生产代码中加入黑客。