主线程优先级
你可以很容易验证主线程(main thread)的优先级:
threads4.rb
puts( Thread.main.priority ) #=> 0
因此,在上一个程序(threads4.rb)中,如果将 t1
的优先级设置为 2,它将“超出”主线程本身优先级,然后将获得所需的所有执行时间,直到下一个线程 t2
到来等等。通过将优先级设置为低于主线程的优先级,你可以强制三个线程仅与它们自己竞争,因为主线程总是会超过它们。如果你更喜欢使用正数,则可以将主线程的优先级设置为高于所有其它线程的值:
Thread.main.priority=100
threads5.rb
那么,现在,如果我们希望 t2
和 t3
具有相同的优先级,并且 t1
具有较低的优先级,我们需要为这三个线程和主线程设置优先级:
Thread.main.priority = 200
t1.priority = 0
t2.priority = 1
t3.priority = 1
如果仔细观察输出,可能会发现一个微小但不良的副作用。有可能(不确定,但可能)你会在开始时发现 t1
线程的一些输出,就在 t2
和 t3
开始并确定它们的优先级之前。这与我们前面提到的问题相同:每个线程一旦创建就尝试开始运行,并且 t1
可能会在其他线程的优先级被“提升”之前获得自己的运行时间切片。为了防止这种情况,我们可以使用 Thread.stop
在创建时专门挂起线程,如下所示:
stop_run.rb
t1 = Thread.new{
Thread.stop
0.upto(50){print( "t1\n" )}
}
现在,当我们想要启动线程运行时(在这种情况下,在设置线程优先级之后),我们调用它的 run
方法:
t1.run