Ruby线程:如何连接来自不同位置的线程以使它们是并发的?

Ruby线程:如何连接来自不同位置的线程以使它们是并发的?,ruby,multithreading,Ruby,Multithreading,这将打印出01234a01234b。我想要打印出来的是:001122334a4b p'b'和p'a'都必须位于线程之外。它们必须在相应的线程完成后执行a和b线程必须同时执行 怎么做呢?好吧,如果你在加入时改变,你会非常接近 a = Thread.new { 5.times { |i| p i; sleep 0.1 } } a.join p 'a' b = Thread.new { 5.times { |k| p k; sleep 0.1 } } b.join p 'b' 但这种行为并不能保证

这将打印出01234a01234b。我想要打印出来的是:001122334a4b

p'b'
p'a'
都必须位于线程之外。它们必须在相应的线程完成后执行ab线程必须同时执行


怎么做呢?

好吧,如果你在加入时改变,你会非常接近

a = Thread.new { 5.times { |i| p i; sleep 0.1 } }
a.join
p 'a'

b = Thread.new { 5.times { |k| p k; sleep 0.1 } }
b.join
p 'b'

但这种行为并不能保证。如果没有某种线程同步,您将得到调度器希望您得到的任何东西。你是否总是想要精确的排序?

“它们必须在相应的线程完成后执行”-然后将它们放在线程体的末尾,不?SergioTulentsev,实际上是的,首先我决定在我的情况下不可能,但我再次查看了它,发现它是正确的。这将解决一个问题。@lakesare如果您的问题已经解决,请在下面选择一个答案作为“已接受的答案”(绿色复选标记)。@HunterStevens,是的,谢谢您提醒我。在我的应用程序中,在
a线程块
之后放置a.join和
b线程块
之后放置b.join非常重要。而
p'a'
必须在
完成时准确触发,因为它的值是在线程中生成的。实际上,这是我的代码,如果它能更清楚地说明我想要实现的目标:如果连接必须发生在示例中的连接位置,我不相信它能实现您想要的。是的,看起来是这样的,或者我应该完全改变我的体系结构。@lakesare听起来好像你不明白
连接的目的:它会阻塞主线程,直到连接的线程完成。如果在创建
b
@Max之前加入
a
,那么根本没有办法让
b
a
同时运行,这是真的,我对它们非常困惑(在我的示例中,它们的存在只是为了在线程出错时产生错误)。那么连接必须一个接一个地并发执行?
a = Thread.new { 5.times { |i| p i; sleep 0.1 } }
b = Thread.new { 5.times { |k| p k; sleep 0.1 } }
a.join
b.join
p 'a'
p 'b'