Thread.join blocks the main thread Thread.join blocks the main thread multithreading multithreading

Thread.join blocks the main thread


You simply accumulate the threads in another container, then join them one-by-one after they've all been created:

my_threads = []for i in 1..100 do    puts "Creating thread #{i}"    my_threads << Thread.new(i) do |j|        sleep 1        puts "Thread #{j} done"    endendputs "#{Thread.list.size} threads"my_threads.each do |t|    t.joinend

You also can't bind the thread to the i variable because i gets constantly overwritten, and your output will be 100 lines of "Thread 100 done"; instead, you have to bind it to a copy of i, which I have cleverly named j.


You need to join the threads outside of the loop.

for i in 1..100 do  puts "Creating thread #{i}"  t = Thread.new(i) do |mi|    sleep 1    puts "Thread #{mi} done"  endend# Wait for all threads to endThread.list.each do |t|  # Wait for the thread to finish if it isn't this thread (i.e. the main thread).  t.join if t != Thread.current end