Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 这些线是如何工作的?_Ruby_Multithreading - Fatal编程技术网

Ruby 这些线是如何工作的?

Ruby 这些线是如何工作的?,ruby,multithreading,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 这意味着只启动了第一个线程

我有一个小代码只是为了测试

#!/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
这意味着只启动了第一个线程。 这是否意味着ruby会在第一个线程关闭时等待第二个线程的启动? 如何以线程的形式运行线程,我希望我的应用程序中的线程能够并行工作,主应用程序线程将是它自己的工作


你能给我什么建议?

代码不是在线程中运行循环,而是在主线程中运行循环;这使得线程由于无限循环而无法启动

替换以下行(括号):

带(大括号):


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

代码不是在线程中运行循环,而是在主线程中运行循环;这使得线程由于无限循环而无法启动

替换以下行(括号):

带(大括号):


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

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

试着这样称呼它:

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

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

试着这样称呼它:

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