运行 线程在 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
(不同于当该行被 未 注释时)。因此,预期的结果。
使用此代码:
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
(不同于当该行被 未 注释时)。因此,预期的结果。