为什么在加入第二个线程之前,第一个连接线程之间的主代码是否执行?

时间:2018-05-04 15:37:21

标签: ruby multithreading

我正在学习线程并拥有以下代码:

buffer[b][0] = 0

输出结果为:

def timefunc(delay)
  i = 0
  while i <= 2
    puts "func w/ #{delay} second delay at: #{Time.now}"
    puts "Thread priority: #{Thread.current.priority}"
    sleep(delay)
    i = i + 1
  end
end

puts "Started program at #{Time.now}"

t1 = Thread.new{timefunc(2)}
t2 = Thread.new{timefunc(1)}

puts "before joins"

t1.join
puts "between joins"
t2.join

puts "after joins"

puts "Ended program at #{Time.now}"

我认为在t1.join中启动的线程在执行main Started program at 2018-05-04 10:23:51 -0600 before joins func w/ 1 second delay at: 2018-05-04 10:23:51 -0600 func w/ 2 second delay at: 2018-05-04 10:23:51 -0600 Thread priority: 0 Thread priority: 0 func w/ 1 second delay at: 2018-05-04 10:23:52 -0600 Thread priority: 0 func w/ 2 second delay at: 2018-05-04 10:23:53 -0600 Thread priority: 0 func w/ 1 second delay at: 2018-05-04 10:23:53 -0600 Thread priority: 0 func w/ 2 second delay at: 2018-05-04 10:23:55 -0600 Thread priority: 0 between joins after joins Ended program at 2018-05-04 10:23:57 -0600 之前会完成所有工作,但是当t2.join首先执行时我感到很惊讶。解释器是否提前查找任何连接语句并首先运行它们?这是如何工作的?

1 个答案:

答案 0 :(得分:2)

我认为你可能会发现这种变化很有启发性:

sleep 10
puts "before joins"

允许线程在创建它们的那一刻开始工作,因此插入这一个睡眠允许两个线程在主线程执行任何其他操作之前完成所有工作。

t1.join类似,但不是等待10秒,而是说“不要让当前线程继续进行直到t1完成”#34;。所以它正在完成所有的工作&#34;它等待t1完成,到那时t2也完成了。所以你可以看到输出之间和之后的输出。