首页 > 解决方案 > 线程中的 Ruby 线程

问题描述

我有一个像这样线程的文件:

Thread.new do
   # Do something
end.join

我的问题是关于子线程。我知道上面的线程将与主线程连接,并且主线程将在终止主线程之前“等待”该线程完成。

然而,这个生命周期在这个例子中是如何工作的:

Thread.new do
    # Do Something

    Thread.new do
        # Do something else
    end.join
end.join

内线程是加入父线程还是加入主线程?外线程是否在内线程上“等待”而主线程在主线程上“等待”?

再次感谢!

标签: rubyruby-on-rails-4

解决方案


我知道上面的线程将与主线程连接,并且主线程将在终止主线程之前“等待”该线程完成。

它只是因为你说.join的。Ruby 不等待线程;程序终止时未加入的任何线程都将被杀死。

内线程是加入父线程还是加入主线程?

它完全按照它的指示去做:外部线程说“启动一个线程,然后加入它,然后结束”。主线程将等待所有这些完成,因为它也被告知.join外部线程。

main  -launch-----------------------join
outer        \---launch-----join---/
inner                  \---/

这是一个相反的例子 - 再次,只是因为我明确告诉它这样做:

inner = nil
outer = Thread.new do
    inner = Thread.new do
        sleep(3)
        p "Inner done"
    end

    sleep(2)
    p "Outer done"
end

sleep(1)
inner.join
p "Inner joined"
outer.join
p "Outer joined"

main  -launch----------------join---join
outer        \---launch-----/------/
inner                  \---/

推荐阅读