Я знаю, что вышеупомянутый поток присоединится к основному потоку, и основной поток будет "ждать" завершения этого потока, прежде чем завершит основной поток.
Он только делает этопотому что ты сказал .join
.Руби не ждет потоков;все потоки, не присоединенные к моменту завершения программы, уничтожаются.
Внутренний поток присоединяется к родительскому потоку или к основному потоку?
Этоименно то, что сказано делать: внешний поток говорит: «запустите поток, затем присоединитесь к нему, затем закончите».Основной поток будет ждать, пока все это завершится, потому что ему тоже было сказано .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 \---/