スレッドを呼び出すjoin
と、参加するスレッドが終了していない間、親スレッドがブロックされます。これを確認するために、次のコードを作成しました。
threads = []
3.times do |i|
threads << Thread.new do
3.times do |j|
puts "Thread #{i} says #{j} (#{Thread.current})"
sleep 0.1
end
end
end
#threads.map(&:join)
threads[0].join
puts "After first join"
threads[1].join
puts "After second join"
threads[2].join
puts "Last line of main thread"
このようなコードを実行すると、次の出力が得られます。
Thread 0 says 0 (#<Thread:0x007fdceb0b8568>)
Thread 2 says 0 (#<Thread:0x007fdce982bb08>)
Thread 1 says 0 (#<Thread:0x007fdceb0b8450>)
Thread 0 says 1 (#<Thread:0x007fdceb0b8568>)
Thread 1 says 1 (#<Thread:0x007fdceb0b8450>)
Thread 2 says 1 (#<Thread:0x007fdce982bb08>)
Thread 1 says 2 (#<Thread:0x007fdceb0b8450>)
Thread 2 says 2 (#<Thread:0x007fdce982bb08>)
Thread 0 says 2 (#<Thread:0x007fdceb0b8568>)
After first join
After second join
Last line of main thread
この印刷命令の後に命令が実行されたにもかかわらず、なぜルビはAfter first join
スレッドの命令の後に印刷したのですか?threads[1].join