代码之家  ›  专栏  ›  技术社区  ›  Bernard

thread.join阻塞主线程

  •  16
  • Bernard  · 技术社区  · 14 年前

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

    这里是join的典型用法。

    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"
    

    这给了

         Creating thread 1  
         Thread 1 done  
         Creating thread 2  
         Thread 2 done  
         ...  
         1 threads  
    

    但我在找如何得到这个

        Creating thread 1  
        Creating thread 2  
        ...  
        101 threads  
        Thread 1 done  
        Thread 2 done  
        ...  
    

    代码在Ruby1.8.7和1.9.2中给出了相同的输出。

    2 回复  |  直到 14 年前
        1
  •  18
  •   Mark Rushakoff    14 年前

    您只需将线程累积到另一个容器中,然后 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 变量,因为 不断被覆盖,您的输出将是100行“线程100完成”;相反,您必须将其绑定到 我已经聪明地命名了 j .

        2
  •  6
  •   joast    14 年前

    您需要在循环之外连接线程。

    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 (i.e. the main thread).
      t.join if t != Thread.current
     end