运行 线程在 Java 时更改线程优先级的条件是什么?

What are the Conditions to Change Thread Priority while Running Thread in Java?

使用此代码:

public static void main(String[] args) throws InterruptedException {
    MyThread testThread = new MyThread();

    System.out.println(testThread.getPriority());

    testThread.start();

    System.out.println(testThread.getPriority());
    testThread.setPriority(7);
    System.out.println(testThread.getPriority());
}

我得到一个输出,其中 setPriority 按预期工作 - 输出为 5-5-7。 但是在注释掉最上面的getPriority时如下:

public static void main(String[] args) throws InterruptedException {
    MyThread testThread = new MyThread();

    //System.out.println(testThread.getPriority());

    testThread.start();

    System.out.println(testThread.getPriority());
    testThread.setPriority(7);
    System.out.println(testThread.getPriority());
}

优先级完全没有改变,我得到 5-5 的输出。为什么会这样,什么决定线程优先级是否改变?

如果您更改已经 运行 的线程的优先级,则不会有任何效果。例如:

    MyThread testThread = new MyThread();
    System.out.println(testThread.getPriority());
    testThread.start();
    // sleep for 1 second, making sure that testThread is done
    LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
    // reports false
    System.out.println(testThread.isAlive());
    System.out.println(testThread.getPriority());

    testThread.setPriority(8);
    System.out.println(testThread.getPriority());

运行 这将显示 testThread.setPriority(8); 没有效果,线程不再存在。

如果我们转到您的示例并添加两个语句:

    System.out.println(testThread.getPriority());
    System.out.println(testThread.isAlive());
    testThread.setPriority(7);
    System.out.println(testThread.isAlive());
    System.out.println(testThread.getPriority());

and 运行 代码 with and without that System.out.println(testThread.getPriority()); - 你会在一种情况下看到(当该行被注释时),该线程不再是 alive(不同于当该行被 注释时)。因此,预期的结果。