Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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,我已经开始研究Ruby中的多线程 所以基本上,我想创建几个线程,并让它们全部执行,但在线程成功完成之前不显示任何输出 例如: #!/usr/bin/env ruby t1 = Thread.new { puts "Hello_1" sleep(5) puts "Hello_1 after 5 seconds of sleep" } t2 = Thread.new { puts "Hello_2" sleep(5) puts "Hello_2 after 5 seconds of slee

我已经开始研究Ruby中的多线程

所以基本上,我想创建几个线程,并让它们全部执行,但在线程成功完成之前不显示任何输出

例如:

#!/usr/bin/env ruby

t1 = Thread.new {
puts "Hello_1"
sleep(5)
puts "Hello_1 after 5 seconds of  sleep"
}

t2 = Thread.new {
puts "Hello_2"
sleep(5)
puts "Hello_2 after 5 seconds of  sleep"
}

t1.join
t2.join

puts "Hello_3"
sleep(5)
puts "Hello_3 after 5 seconds of  sleep"

第一个Hello_1/Hello_2立即执行。在线程成功完成之前,我不希望显示任何输出。

因为将打印内容放入单个输出流(sysout),如果要捕获每个线程的输出,就不能使用它

您必须为每个线程使用单独的缓冲流,在每个线程中写入缓冲流,然后在线程终止时将它们转储到sysout以查看输出

下面是一个线程示例:

t = Thread.new() do
  io = StringIO.new
  io << "mary"
  io.puts "fred"
  io.puts "fred"
  puts io.string
end

您可以共享缓冲区,但应“同步”对其的访问:

buffer = ""
lock = Mutex.new

t1 = Thread.new {
lock.synchronize{buffer << "Hello_1\n"}
sleep(5)
lock.synchronize{buffer << "Hello_1 after 5 seconds of  sleep\n"}
}

t2 = Thread.new {
lock.synchronize{buffer << "Hello_2\n"}
sleep(5)
lock.synchronize{buffer << "Hello_2 after 5 seconds of  sleep\n"}
}

t1.join
t2.join

puts buffer
buffer=“”
lock=Mutex.new
t1=线程。新{

锁定。同步{buffer你能提供一个简单的例子吗?我在别处找不到任何关于这个的东西。链接的博客文章不再可用。你还有代码吗?你能把它放进要点并更新答案吗?@Schneems,不,对不起,我没有。谢谢你!我更喜欢grillp的例子,因为我没有共享任何缓冲区。不过这确实有效,谢谢。
buffer = ""
lock = Mutex.new

t1 = Thread.new {
lock.synchronize{buffer << "Hello_1\n"}
sleep(5)
lock.synchronize{buffer << "Hello_1 after 5 seconds of  sleep\n"}
}

t2 = Thread.new {
lock.synchronize{buffer << "Hello_2\n"}
sleep(5)
lock.synchronize{buffer << "Hello_2 after 5 seconds of  sleep\n"}
}

t1.join
t2.join

puts buffer