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

在Java中运行线程时,更改线程优先级的条件是什么?,java,multithreading,java-threads,Java,Multithreading,Java Threads,使用此代码: public static void main(String[] args) throws InterruptedException { MyThread testThread = new MyThread(); System.out.println(testThread.getPriority()); testThread.start(); System.out.println(testThread.getPriority()); t

使用此代码:

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

并在有和没有
System.out.println(testThread.getPriority())的情况下运行代码-您将看到,在一种情况下(当该行被注释时),线程不再处于活动状态(与该行未被注释时不同)。这就是预期的结果。

非常感谢您的回答!
getPriority()
如何在额外的时间内保持线程的活动状态?@Beo这只是线程调度如何发生的一个工件,请记住,即使我们在这里讨论的行为也不能保证。您可以添加一个简单的
testThread.start();锁支持.parknos(时间单位.秒.toNanos(1))并请注意,代码现在已更改。。。