我正在for
循环中创建线程,并且我想使用for
循环i
作为每个特定线程的名称。当我运行它时,我得到的是,而不是1
,2
或2
, 。有没有更好/更安全的方法将变量传递到线程中?1
2
2
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
我正在for
循环中创建线程,并且我想使用for
循环i
作为每个特定线程的名称。当我运行它时,我得到的是,而不是1
,2
或2
, 。有没有更好/更安全的方法将变量传递到线程中?1
2
2
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
您的问题是i
您所指的不是传递给线程的块变量,而是在线程i
外部定义的。你需要添加|i|
它,你会得到1
,2
或2
, 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)
您可以通过块传递变量
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