为什么一次加入5个线程导致同时活动?

时间:2015-03-13 13:35:16

标签: ruby multithreading

Thread.new{sleep rand(0..10}; puts '#1 done'}.join
Thread.new{sleep rand(0..10}; puts '#2 done'}.join
Thread.new{sleep rand(0..10}; puts '#3 done'}.join
Thread.new{sleep rand(0..10}; puts '#4 done'}.join
Thread.new{sleep rand(0..10}; puts '#5 done'}.join

这将导致线程1在线程2开始之前执行完成。我总是得到输出1-2-3-4-5,批次最多可能需要50秒。

t1 = Thread.new {sleep rand(0..10); puts 'Thread 1 done.'}
t2 = Thread.new {sleep rand(0..10); puts 'Thread 2 done.'}
t3 = Thread.new {sleep rand(0..10); puts 'Thread 3 done.'}
t4 = Thread.new {sleep rand(0..10); puts 'Thread 4 done.'}
t5 = Thread.new {sleep rand(0..10); puts 'Thread 5 done.'}
[t1,t2,t3,t4,t5].map(&:join)

然而,这导致所有5个线程并行执行;每次我得到一个随机输出订单,整个批次不会超过10秒。

我的问题是:为什么?

我的理解是map将遍历数组中的每个项目并依次对每个项目执行Thread#join方法......这正是我的第一个代码示例所做的。所以我期望完全相同的结果,但那里显然存在一些差异。

1 个答案:

答案 0 :(得分:3)

  

我的理解是map将遍历数组中的每个项目并依次对每个项目执行Thread#join方法......这正是我的第一个代码示例所做的。

不,不是。

第一个代码启动一个线程,然后加入它 - 然后然后启动下一个线程,加入它等等。没有涉及并行性:

Start thread 1
Join thread 1
Start thread 2
Join thread 2
Start thread 3
Join thread 3
Start thread 4
Join thread 4
Start thread 5
Join thread 5

第二个代码启动 all 线程,然后加入所有。因此,当执行第一个join调用时,所有线程都在运行,而不仅仅是一个额外的线程。

Start thread 1
Start thread 2
Start thread 3
Start thread 4
Start thread 5
Join thread 1
Join thread 2
Join thread 3
Join thread 4
Join thread 5

你明白为什么那些不同吗?