ruby – Thread.join阻止主线程

前端之家收集整理的这篇文章主要介绍了ruby – Thread.join阻止主线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
调用Thread.join阻止当前(主)线程.但是当主线程退出时,不会在所有产生的线程中调用join结果,以被杀死.一个如何在Ruby中生成持久的子句线程而不阻塞主线程?

这是连接的典型用法.

  1. for i in 1..100 do
  2. puts "Creating thread #{i}"
  3. t = Thread.new(i) do |j|
  4. sleep 1
  5. puts "Thread #{j} done"
  6. end
  7. t.join
  8. end
  9. puts "#{Thread.list.size} threads"

这给了

  1. Creating thread 1
  2. Thread 1 done
  3. Creating thread 2
  4. Thread 2 done
  5. ...
  6. 1 threads

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

  1. Creating thread 1
  2. Creating thread 2
  3. ...
  4. 101 threads
  5. Thread 1 done
  6. Thread 2 done
  7. ...

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

解决方法

您只需将线程累积到另一个容器中,然后在创建完毕后逐个加入它们:
  1. my_threads = []
  2. for i in 1..100 do
  3. puts "Creating thread #{i}"
  4. my_threads << Thread.new(i) do |j|
  5. sleep 1
  6. puts "Thread #{j} done"
  7. end
  8. end
  9. puts "#{Thread.list.size} threads"
  10.  
  11. my_threads.each do |t|
  12. t.join
  13. end

您也不能将线程绑定到i变量,因为我不断被覆盖,并且您的输出将是100行“线程100完成”;相反,你必须将它绑定到我的一个副本,我巧妙地命名为j.

猜你在找的Ruby相关文章