调用 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"
这给出了
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 ...
代码在 Ruby 1.8.7 和 1.9.2 中给出相同的输出
最佳答案
您只需将线程累积到另一个容器中,然后在它们全部创建后将它们一个接一个地加入
:
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
您也不能将线程绑定(bind)到 i
变量,因为 i
会不断被覆盖,您的输出将是 100 行“Thread 100 done”;相反,您必须将它绑定(bind)到 i
的副本,我巧妙地将其命名为 j
。
关于ruby - Thread.join 阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3481866/