0

我正在进入 ruby​​ 并且已经使用线程有一段时间了,但并没有完全理解它们。我注意到,在向数组添加线程时,如果我将 sleep() 命令添加为第一个命令,则线程不会运行,直到我执行我想要的连接。所以我有2个问题。

1.这是假设发生的吗?

2.有没有比我现在做的更好的方法。这是一个示例代码,我必须展示我在说什么。

job = Array.new
10.times do |n|
    job << Thread.new do
        sleep 0.001
        puts "done #{n}"
    end 
end
#job.each do |t|
    #t.join
#end

puts "End of script"

输出是

End of script

如果我删除评论输出是

done 1  
done 0  
done 7  
done 6  
done 5  
done 4  
done 3  
done 2  
done 9  
done 8  
End of script

所以我现在使用它,但我不明白为什么会这样。有时我注意到甚至做一些像`echo hi`而不是sleep的事情。

提前致谢。

4

1 回答 1

0

线程的计时不是定义的行为。一旦你让它们进入睡眠状态,它们就会被放入一个队列中以便稍后运行。你永远不能指望它以一种或另一种方式运行。

您的主程序运行时间不会很长,因此很可能在您的其他线程重新启动以再次运行之前完成。真的,仔细想想,0.001 秒对计算机来说是相当长的时间,因此在这段时间内旋转 10 个线程很可能会发生——但即使需要更长的时间,也不能保证线程会在之后立即恢复。 001 秒。通常也不能保证它不会在 0.001 秒之前开始,但是睡眠呼叫通常不会提前结束。

当您添加连接调用时,您会在主线程中引入额外的时间,从而允许其他线程有时间运行,因此这种行为是预期的。

于 2013-07-10T21:45:41.323 回答