setPriority()方法无法正常工作

我从这里做示例代码。 我得到了结果:

Thread[Thread-3,1,main]: 5 Thread[Thread-0,10,main]: 5 Thread[Thread-2,1,main]: 5 Thread[Thread-1,1,main]: 5 Thread[Thread-4,1,main]: 5 Thread[Thread-0,10,main]: 4 Thread[Thread-3,1,main]: 4 Thread[Thread-2,1,main]: 4 Thread[Thread-0,10,main]: 3 Thread[Thread-5,1,main]: 5 Thread[Thread-3,1,main]: 3 Thread[Thread-2,1,main]: 3 Thread[Thread-1,1,main]: 4 Thread[Thread-5,1,main]: 4 Thread[Thread-3,1,main]: 2 Thread[Thread-2,1,main]: 2 Thread[Thread-5,1,main]: 3 Thread[Thread-3,1,main]: 1 Thread[Thread-4,1,main]: 4 Thread[Thread-0,10,main]: 2 Thread[Thread-2,1,main]: 1 Thread[Thread-5,1,main]: 2 Thread[Thread-4,1,main]: 3 Thread[Thread-5,1,main]: 1 Thread[Thread-1,1,main]: 3 Thread[Thread-0,10,main]: 1 Thread[Thread-4,1,main]: 2 Thread[Thread-1,1,main]: 2 Thread[Thread-4,1,main]: 1 Thread[Thread-1,1,main]: 1 

似乎setPriority无法正常工作。 为什么?

如何修改示例代码以查看属性的效果。

你发现的例子已经破了。

  • 正如其他问题和评论所指出的,如果您的JVM可以使用多个核心,那么多个线程可以并行运行。 当发生这种情况时,它不仅仅是运行的最高优先级可运行线程。

  • 最重要的是,线程调度程序相对于优先级的行为取决于平台,尤其是因为在许多平台上,线程调度是由OS而不是Java实现的。

以下是一些涉及线程优先级的选定Oracle引用:

  • 推荐的编码惯例:不依赖于线程优先级
  • Java线程问题 – 其中说:

    本机线程JVM上的Java线程可用的线程优先级应被视为调度程序的提示,尤其是在线程受计算限制的情况下。 进程可用的处理器数量是动态且不可预测的。 因此,尝试使用优先级来安排任何多任务,多处理器系统上的执行不太可能成功。

除了这种材料,以及关于Java优先级如何映射到本机线程优先级的材料之外,Oracle文档几乎没有提及Java SE的线程优先级及其含义。 当然,没有尝试精确地指定行为。

Java RT(实时)是一个不同的问题,但它不再是Oracle支持的产品系列。 (据我所知)。

我假设你有一个多核CPU。

线程优先级仅影响线程调度 ,即它有助于系统决定在有多个线程等待执行的情况下下一个运行的线程。

但在您的情况下,每个线程都分配给不同的核心。 没有等待的线程,也没有必要进行调度 。 所有六个线程确实并行运行,线程优先级没有任何影响。

如果要查看线程优先级的影响,请稍微更改main方法以创建足够的高优先级线程以占用所有CPU内核。 然后,调度启动和线程优先级发挥作用:

 public static void main(String[] args) { for (int i = 0; i < 5; i++) new SimplePriorities(Thread.MIN_PRIORITY); // create enough high priority threads to occupy all CPU cores: for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) new SimplePriorities(Thread.MAX_PRIORITY); }