如何工作这些线程?

时间:2014-12-01 08:16:07

标签: ruby multithreading

我只有一个小代码用于测试

#!/usr/bin/env ruby

def A
 puts "A"
 sleep 2
end

def B
  puts "B"
  sleep 2
end

[ 
  Thread.new(loop{A()}),
  Thread.new(loop{B()}) 
].each do |thr|
    thr.join
  end

并没有按照我的意愿行事。 我希望我能得到

A
B
A
B

等等,但我得到了

A
A
A
A

这意味着只启动了第一个线程。 是否意味着当第一个线程关闭以开始第二个线程时,红宝石会等待? 我如何以线程形式运行Thread,我希望我的应用程序中的线程可以并行使他们的工作和主应用程序线程将是它自己的工作。

你能告诉我什么?

2 个答案:

答案 0 :(得分:3)

代码在线程中运行循环,而不是在主线程内运行循环;因为无限循环而导致线程无法启动。

替换以下行(括号):

[
  Thread.new(loop{A()}),
  Thread.new(loop{B()}) 
]

with(braces):

[
  Thread.new{loop{A()}},
  Thread.new{loop{B()}} 
]

传递块而不是(无限)循环的返回值。

答案 1 :(得分:1)

您对Thread ctor的调用没有达到预期效果。您正在将循环块的结果传递给Thread构造函数。这样,循环必须在Thread开始之前结束。但是由于你的循环永远不会结束,你只能看到当前线程中正在执行的A()方法输出。

尝试以这种方式调用它:

[
 Thread.new{loop{A()}},
 Thread.new{loop{B()}}
]