@hugohe 你好。两个子线程跑起来先执行 Thread.stop,让自身进入 sleep 模式。主线程的 run 代码就是为了唤醒他们。导致死锁的原因应该是调用 run 的时候,子线程还没有跑起来(new 以后自动运行)。等 run 之后,子线程自动跑起来,又把自己 stop 了,而 join 没有 timeout 参数,导致死锁。所以加 sleep 一定要在 run 前面,确保 run 的执行发生在 stop 之后。 如果不想用 hardcode 的时间,可以加个 countdown 变量,虽然理论上还是无法保证 100% 不死锁,但发生的概率就非常小了。参考代码如下:
....
wait_thread = 2
threads = [
Thread.new {
wait_thread -= 1; Thread.stop ; c1.chase(c2)
},
Thread.new {
wait_thread -= 1; Thread.stop ; c2.chase(c1)
}
]
while wait_thread > 0
end
start_index = rand(2)
....
这里有类似的问题讨论 http://stackoverflow.com/questions/8925001/deadlock-in-ruby-join 以及 Thread 相关 API 的说明 http://rubylearning.com/satishtalim/ruby_threads.html
如下加个 sleep 0.1 试试。可能是主线程跑太快了,或子线程从 Thread.stop 恢复需要时间调度
sleep 0.1 threads[start_index].run threads[1-start_index].run