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