java中sleep和join的相似之处

时间:2014-06-02 07:37:43

标签: java multithreading concurrency thread-sleep

正如问题所示,我想知道线程上sleep和join方法之间的相似性。我已经经历了许多描述睡眠和连接方法之间差异的问题。但我想知道睡眠和连接方法可以互换使用的不同场景。根据我的想法,下面的代码应该以同样的方式工作。我有一个主线程,我在其中启动一个新线程(只有1),我希望主线程等待新线程完成一段时间。代码如下:

   newThread.join(10000)

或,

  Thread.sleep(10000)

但是,当我运行此代码时,我没有得到预期的结果。为什么会这样?技术上它应该是一样的吗?

2 个答案:

答案 0 :(得分:6)

否否否

sleepjoin 完全不同

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)。其他任何东西都是“黑客”,我们不会在生产代码中加入黑客。