在 Ruby 中等待线程结束

8
似乎在 Ruby 2.4 和 2.5 中,当你在线程上调用 #kill 方法时,线程并不会立即停止。以下代码片段将打印几次 Not dead
thread = Thread.new { loop {} }
thread.kill
puts "Not dead" while thread.alive?

我希望能够在次要线程被终止之前阻止主线程的执行。我尝试使用thread.join.kill,但是这会阻塞主线程,因为线程的循环永远不会终止。
如何确保在主线程继续之前线程已被终止?
2个回答

12

已经解决了;即使杀死线程,你仍然可以#join该线程,因此你可以使用thread.kill.join来阻塞直到线程死亡。

此代码永远不会打印出Not dead

thread = Thread.new { loop {} }
thread.kill.join
puts "Not dead" while thread.alive?

值得注意的是,join会阻塞调用线程,直到线程被正确终止。 - tadman

1
我正在做这件事情:

thread = Thread.new { loop {} }
thread.kill
sleep 0.001 while thread.alive?

这是我在线程池中终止线程的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接