Java 多线程优先级:为什么在这个例子中,有时 t1 在 t2 完成之前发生,即使 t2 具有更高的优先级?
Java Multithreading priority: Why in this example, sometimes t1 occurs before t2 is completed, even if t2 has higher priority?
示例:
class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run(){
for (int i=0; i<5; i++) {
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")"
+", loop "+i);
}
}
};
public class Demo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")");
Thread t1=new MyThread("t1"); // t1
Thread t2=new MyThread("t2"); // t2
t1.setPriority(1); // t1 priority 1
t2.setPriority(10); //t2 priority 10
t1.start(); // start t1
t2.start(); // start t2
}
}
当我执行程序时,有时我会得到如下输出:
//Output1
main(5)
t2(10), loop 0
t2(10), loop 1
t2(10), loop 2
t2(10), loop 3
t2(10), loop 4
t1(1), loop 0
t1(1), loop 1
t1(1), loop 2
t1(1), loop 3
t1(1), loop 4
有时我的输出如下:
//Output2
main(5)
t1(1), loop 0
t1(1), loop 1
t1(1), loop 2
t1(1), loop 3
t1(1), loop 4
t2(10), loop 0
t2(10), loop 1
t2(10), loop 2
t2(10), loop 3
t2(10), loop 4
在其他一些情况下,我有输出,其中 t1 首先开始,t2 在 t1 完成所有输出之前开始。
我认为 output1
比 “Threads with higher priority are executed in preference to threads with lower priority.” 更有意义
我们如何理解这个例子背后的原因?
正如您在 post 中提到的那样:
“Threads with higher priority are executed in preference to threads with lower priority.”
这确实意味着,具有较高优先级的线程比低优先级线程具有更高的可能性被执行。这并不意味着具有更高优先级的线程将始终先执行 first/finish。实际的线程处理取决于 OS(java 仅使用它运行的 OS 提供的线程库)。
优先级较低的线程首先启动,因此在某些情况下它甚至可能在优先级较高的线程启动之前完成。 5次迭代并没有那么多。
在我的 (Windows) 机器上,如果我将迭代次数替换为 100,则始终会首先选择优先级较高的线程。
我关于线程优先级的笔记:
- 您可以使用它来提高性能
- 优先级取决于 OS(Windows 有 7 个,Linux 忽略它们)
- 不要以正确工作取决于优先级的方式设计您的应用程序
- 如果有一些高优先级的线程永远不会被停用,那么低优先级的线程永远不会运行
示例:
class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run(){
for (int i=0; i<5; i++) {
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")"
+", loop "+i);
}
}
};
public class Demo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")");
Thread t1=new MyThread("t1"); // t1
Thread t2=new MyThread("t2"); // t2
t1.setPriority(1); // t1 priority 1
t2.setPriority(10); //t2 priority 10
t1.start(); // start t1
t2.start(); // start t2
}
}
当我执行程序时,有时我会得到如下输出:
//Output1
main(5)
t2(10), loop 0
t2(10), loop 1
t2(10), loop 2
t2(10), loop 3
t2(10), loop 4
t1(1), loop 0
t1(1), loop 1
t1(1), loop 2
t1(1), loop 3
t1(1), loop 4
有时我的输出如下:
//Output2
main(5)
t1(1), loop 0
t1(1), loop 1
t1(1), loop 2
t1(1), loop 3
t1(1), loop 4
t2(10), loop 0
t2(10), loop 1
t2(10), loop 2
t2(10), loop 3
t2(10), loop 4
在其他一些情况下,我有输出,其中 t1 首先开始,t2 在 t1 完成所有输出之前开始。
我认为 output1
比 “Threads with higher priority are executed in preference to threads with lower priority.” 更有意义
我们如何理解这个例子背后的原因?
正如您在 post 中提到的那样:
“Threads with higher priority are executed in preference to threads with lower priority.”
这确实意味着,具有较高优先级的线程比低优先级线程具有更高的可能性被执行。这并不意味着具有更高优先级的线程将始终先执行 first/finish。实际的线程处理取决于 OS(java 仅使用它运行的 OS 提供的线程库)。
优先级较低的线程首先启动,因此在某些情况下它甚至可能在优先级较高的线程启动之前完成。 5次迭代并没有那么多。 在我的 (Windows) 机器上,如果我将迭代次数替换为 100,则始终会首先选择优先级较高的线程。
我关于线程优先级的笔记:
- 您可以使用它来提高性能
- 优先级取决于 OS(Windows 有 7 个,Linux 忽略它们)
- 不要以正确工作取决于优先级的方式设计您的应用程序
- 如果有一些高优先级的线程永远不会被停用,那么低优先级的线程永远不会运行