Приоритет многопоточности Java: почему в этом примере иногда t1 происходит до завершения t2, даже если t2 имеет более высокий приоритет?
Пример:
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
имеет больше смысла, поскольку "потоки с более высоким приоритетом выполняются предпочтительнее потоков с более низким приоритетом". Как мы можем понять причину этого примера?
3 ответа
Как вы уже упоминали в своем посте:
"Потоки с более высоким приоритетом выполняются предпочтительнее потоков с более низким приоритетом".
Это означает, что поток с более высоким приоритетом имеет более высокую вероятность выполнения, чем поток с низким приоритетом. Это не означает, что поток с более высоким приоритетом всегда будет выполняться первым / первым. Фактическая обработка потоков зависит от ОС (java просто использует библиотеки потоков, предоставляемые ОС, на которой он работает).
Ваш поток с более низким приоритетом запускается первым, поэтому в некоторых случаях он может завершиться даже до того, как начнется даже процесс с более высоким приоритетом. 5 итераций не так уж много. На моей (Windows) машине, если я заменим количество итераций на 100, сначала будет последовательно выбран поток с более высоким приоритетом.
Мои заметки о приоритетах тем:
- Вы можете использовать его для улучшения производительности
- Приоритеты зависят от ОС (Windows имеет 7, Linux игнорирует их)
- Не разрабатывайте свое приложение так, чтобы правильная работа зависела от приоритетов
- Если есть потоки с высокими приоритетами, которые никогда не отключаются, потоки с более низким приоритетом никогда не смогут быть запущены