Thread.join阻塞主线程

调用Thread.join会阻塞当前(主)线程。 但是,当主线程退出时,不会调用join会导致所有生成的线程被杀死。 如何在不阻塞主线程的情况下在Ruby中生成持久子线程?

这是加入的典型用法。

for i in 1..100 do puts "Creating thread #{i}" t = Thread.new(i) do |j| sleep 1 puts "Thread #{j} done" end t.join end puts "#{Thread.list.size} threads" 

这给了

 创建线程1  
     线程1完成  
     创建线程2  
     线程2完成了  
      ...  
      1个主题  

但我正在寻找如何得到这个

    创建线程1  
    创建线程2  
     ...  
     101个主题  
    线程1完成  
    线程2完成了  
     ...  

代码在Ruby 1.8.7和1.9.2中提供相同的输出

您只需将线程累积到另一个容器中,然后在创建它们之后逐个join它们:

 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" end end puts "#{Thread.list.size} threads" my_threads.each do |t| t.join end 

你也无法将线程绑定到i变量,因为i不断被覆盖,你的输出将是100行“Thread 100 done”; 相反,你必须将它绑定到i的副本,我巧妙地将其命名为j

您需要加入循环外部的线程。

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