主线程优先级

你可以很容易验证主线程(main thread)的优先级:

threads4.rb
  1. puts( Thread.main.priority ) #=> 0

因此,在上一个程序(threads4.rb)中,如果将 t1 的优先级设置为 2,它将“超出”主线程本身优先级,然后将获得所需的所有执行时间,直到下一个线程 t2 到来等等。通过将优先级设置为低于主线程的优先级,你可以强制三个线程仅与它们自己竞争,因为主线程总是会超过它们。如果你更喜欢使用正数,则可以将主线程的优先级设置为高于所有其它线程的值:

  1. Thread.main.priority=100
threads5.rb

那么,现在,如果我们希望 t2t3 具有相同的优先级,并且 t1 具有较低的优先级,我们需要为这三个线程和主线程设置优先级:

  1. Thread.main.priority = 200
  2. t1.priority = 0
  3. t2.priority = 1
  4. t3.priority = 1

如果仔细观察输出,可能会发现一个微小但不良的副作用。有可能(不确定,但可能)你会在开始时发现 t1 线程的一些输出,就在 t2t3 开始并确定它们的优先级之前。这与我们前面提到的问题相同:每个线程一旦创建就尝试开始运行,并且 t1 可能会在其他线程的优先级被“提升”之前获得自己的运行时间切片。为了防止这种情况,我们可以使用 Thread.stop 在创建时专门挂起线程,如下所示:

stop_run.rb
  1. t1 = Thread.new{
  2. Thread.stop
  3. 0.upto(50){print( "t1\n" )}
  4. }

现在,当我们想要启动线程运行时(在这种情况下,在设置线程优先级之后),我们调用它的 run 方法:

  1. t1.run