java:为什么在run方法中有多个print语句时不遵循线程优先级



我正在执行的文件:

class TestMultiPriority1 extends Thread{
public void run(){
System.out.println("running thread name is:"+Thread.currentThread().getName());
System.out.println("running thread priority is:"+Thread.currentThread().getPriority());
}
public static void main(String args[]){
TestMultiPriority1 m1=new TestMultiPriority1();
TestMultiPriority1 m2=new TestMultiPriority1();
m1.setPriority(MIN_PRIORITY);
m2.setPriority(MAX_PRIORITY);
m1.start();``
m2.start();

}
}   

这个代码的输出是:

running thread name is:Thread-0
running thread name is:Thread-1
running thread priority is:1
running thread priority is:10

而预期的输出是

running thread name is:Thread-1
running thread priority is:10
running thread name is:Thread-0
running thread priority is:1

我的意思是,优先级最高的线程应该先完全执行,然后再执行第二个线程,不是吗?这和scheduler有关吗?

Java在任何情况下都不能保证严格的优先级。查看Java语言规范(第二版)第445页:

每个线程都有一个优先级。当存在对处理资源的竞争时,具有较高优先级的线程通常优先于具有较低优先级的线程执行。然而,这种偏好并不能保证最高优先级的线程始终在运行,并且线程优先级不能用于可靠地实现互斥。

"优先级"可能不是你认为的意思。

如果线程A的绝对调度器优先级高于线程B的绝对调度器优先级,则这并不一定会阻止线程B运行。唯一重要的是,如果在任何时刻,想要使用CPU周期的线程比线程运行的CPU多,那么如果线程A没有运行,线程B将不被允许运行。

如果线程A在其他CPU上运行,则线程B可以运行;如果线程A正在等待某件事(例如,等待System.out.println(...)完成),则线程A可以运行。


但是,在Java中,您甚至无法控制调度程序的绝对优先级。

大多数桌面和服务器操作系统都被设计为托管多个独立的应用程序,这些应用程序会争夺CPU时间。操作系统调度程序通常努力为每个应用程序提供公平的CPU共享,并且通常有一个参数(在UNIX/Linux中称为"nice")允许您调整进程或线程的共享相对于其他进程和线程的大小。

这个"nice"参数是Java线程的"优先级"实际控制的。因此,当你给一个线程比另一个线程更高的"优先级"时,你实际上只会给它更大的份额。另一个线程没有得到没有共享,只是得到了一个较小的共享。


您的演示程序可能只占用很少的CPU时间,所以这些都无关紧要。

优先级只是提示。作为Java中关于多线程的许多内容:P。

最新更新