2

我正在for循环中创建线程,并且我想使用for循环i作为每个特定线程的名称。当我运行它时,我得到的是,而不是1,22, 。有没有更好/更安全的方法将变量传递到线程中?122

ts = []
for i in 1..2 do
  ts.push( Thread.new(i) do
    x = i
    puts x
  end)
end
ts.each do |t|
  t.join()
end
4

2 回答 2

3

您的问题是i您所指的不是传递给线程的块变量,而是在线程i外部定义的。你需要添加|i|它,你会得到1,22, 1

ts = []
for i in 1..2 do
  ts.push( Thread.new(i) do |i|
    x = i
    puts x
  end)
end
ts.each do |t|
  t.join()
end

顺便说一句,一个更红的写法是:

ts = (1..2).map do |i|
  Thread.new(i) do |i|
    puts i
  end
end.each(&:join)

如果您正在为每个线程寻找一个唯一的名称,我建议使用线程的对象 ID。

ts = (1..2).map do
  Thread.new do
    puts Thread.current.object_id
  end
end.each(&:join)
于 2012-12-06T17:04:05.927 回答
2

您可以通过块传递变量

ts = []

for i in 1..2 do
  ts.push( Thread.new(i) do |i|
    x = i
    puts x
  end)
end

ts.each do |t|
  t.join()
end

# => 1
# => 2
于 2012-12-06T17:00:51.287 回答