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
方法......这正是我的第一个代码示例所做的。所以我期望完全相同的结果,但那里显然存在一些差异。
答案 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
你明白为什么那些不同吗?