Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:为什么在run方法中有多个print语句时不遵循线程优先级?_Java_Multithreading - Fatal编程技术网

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

java:为什么在run方法中有多个print语句时不遵循线程优先级?,java,multithreading,Java,Multithreading,我正在执行的文件: 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 st

我正在执行的文件:

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();


}
}   
此代码的iam输出为:

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

我的意思是,具有最高优先级的线程应该首先完全执行,然后再执行第二个线程,不是吗?它与schedular有关吗?

Java在任何情况下都不能保证严格的优先级。看看:

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


优先级只是一个提示。正如Java中关于多线程的很多东西一样:P.

优先级可能并不意味着你认为它意味着什么

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

如果线程A在其他CPU上运行,线程B可以运行;如果线程A正在等待某个东西,例如等待System.out.println,线程B可以运行。。。完成

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

大多数桌面和服务器操作系统的设计都是为了承载多个独立的应用程序,这些应用程序争夺CPU时间。操作系统调度程序通常努力为每个应用程序分配公平的CPU份额,在UNIX/Linux中通常有一个名为nice的参数,允许您调整进程或线程相对于其他进程和线程的份额

这个漂亮的参数实际上是Java线程的优先级控制的。所以,当你给予一个线程比另一个线程更高的优先级时,你实际上只是给了它更大的份额。另一个线程没有得到任何共享,它只得到一个较小的共享


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

优先级只是一个提示,操作系统可以随意忽略。如果它不忽略它,则只有当您的CPU利用率接近100%时才有意义,例如,如果您有空闲的CPU,即使是最低优先级的任务也可以运行。