线程的优先级不能决定它是否被唤醒(在使用notify方法的情况下)或者在多线程环境下的唤醒顺序(在使用notifyAll方法的情况下)。因此,因此你永远不应该假设线程的唤醒顺序。另外,你也永远不应该对抢占过程中的线程调度做任何假设。线程调度是实现相关的(implementation-dependent),不同的平台的调度机制是不同的。如果你想你的程序具有可移植性就不应该做这样的不明智的假设。
另外,notifyAll和notify方法没有提供唤醒等待进程的确定顺序,具体的顺序是依赖JVM的,并且notifyAll所能保证的事情不超过唤醒所有的等待线程。这个状况使得当你想以某种特定的顺序唤醒多个线程时会出现问题。
有两种办法达到控制线程的唤醒顺序:
1、使用精确唤醒模式
(Specific notification pattern)
2、使用实现了实时规范的JVM(RTSJ,Real-Time Specification for Java)(译者注:这其实不应该算一种好的方法,这加大了对特定JVM的依赖,打破了可移植性 |