我正在学习线程并拥有以下代码:
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首先执行时我感到很惊讶。解释器是否提前查找任何连接语句并首先运行它们?这是如何工作的?
答案 0 :(得分:2)
我认为你可能会发现这种变化很有启发性:
sleep 10
puts "before joins"
允许线程在创建它们的那一刻开始工作,因此插入这一个睡眠允许两个线程在主线程执行任何其他操作之前完成所有工作。
t1.join
类似,但不是等待10秒,而是说“不要让当前线程继续进行直到t1
完成”#34;。所以它正在完成所有的工作&#34;它等待t1
完成,到那时t2
也完成了。所以你可以看到输出之间和之后的输出。