java中线程的优先级

java中线程的优先级,java,Java,每次我运行程序时,由于线程b的最大优先级分配,执行顺序会发生变化,应该首先启动,然后首先完成,因此输出不会相应地改变 threadA.setPriority(Thread.MIN_PRIORITY); threadB.setPriority(Thread.MAX_PRIORITY) System.out.println("Start Thread A"); threadA.start(); System.out.println("Start Thread B"); threadB.start(

每次我运行程序时,由于线程b的最大优先级分配,执行顺序会发生变化,应该首先启动,然后首先完成,因此输出不会相应地改变

threadA.setPriority(Thread.MIN_PRIORITY);
threadB.setPriority(Thread.MAX_PRIORITY)
System.out.println("Start Thread A");
threadA.start();

System.out.println("Start Thread B");
threadB.start();

System.out.println("End of main Thread");

线程优先级是对操作系统的一个提示,只有当您在所有cpu上使用非常高的cpu利用率(例如100%)时,线程优先级才起作用。一个线程可以在另一个线程启动时运行到完成

顺便说一句:您必须是Windows上的管理员,并且在Linux上具有
root
setcap
权限才能提高优先级


简言之,更改优先级几乎是无用的,不可信赖。

我想引用xagyg的答案:

让我们保持简单,直奔源头

每个线程都有优先级。当存在加工竞争时 资源中,具有较高优先级的线程通常在 优先选择优先级较低的线程。这种偏好不是,, 但是,保证最高优先级的线程始终是 无法使用运行和线程优先级来可靠地实现 相互排斥

摘自Java语言规范(第二版)第445页。还有

尽管Java中存在线程优先级,而且许多引用都表示 JVM将始终选择优先级最高的线程之一 对于调度[52,56,89],当前的 Java语言或虚拟机规范[53,90]。优先事项 只是对调度程序的提示[127,第227页]

来自测试并发Java组件(博士论文,2005)p。62

参考文献127第227页(摘自上述摘录)来自组件 软件:超越面向对象编程(C.Szyperski), 艾迪生·韦斯利,1998年

简而言之,不要依赖线程优先级


如果一台机器有两个或多个内核,运行两个线程(每个线程都分配给自己的内核)——这是通常的情况——那么线程优先级现在可能会生效。每个线程都将以最大单核速度运行

另外:首先从主线程启动线程A。然后你开始线程B。你的主线程有多快?线程A的完成速度是否比线程B的启动速度快

如果要确保执行顺序,必须使用join,而不是优先级


另请参见

这是一个问题还是一个事实?请用普通字体写,这一个让我害怕。请陈述你的问题。可能重复的你确定你需要成为root/administrator吗?我的意思是,我知道如果你想在其他进程中增加进程优先级,你需要这样做,但我一直认为在同一进程的其他线程中增加线程优先级时,你不需要这样做。@EtienMiret当你提高线程优先级时,它是针对所有线程的。在Linux下,我认为您需要更改优先级的权限,但我不确定我在哪里读到的。