Приоритет многопоточности 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 игнорирует их)
  • Не разрабатывайте свое приложение так, чтобы правильная работа зависела от приоритетов
  • Если есть потоки с высокими приоритетами, которые никогда не отключаются, потоки с более низким приоритетом никогда не смогут быть запущены
Другие вопросы по тегам