setPriority()方法无法正常工作

时间:2014-10-27 04:08:40

标签: java multithreading concurrency

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

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无法正常运作。为什么呢?

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

2 个答案:

答案 0 :(得分:4)

您找到的示例已损坏。

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

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

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

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

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

答案 1 :(得分:1)

我假设你有一个多核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);
}