Работают ли потоки с соответствующим номером приоритета? - PullRequest
2 голосов
/ 23 октября 2019

Зачем компилятору печатать 2 a, а затем 2 b или наоборот, если дать приоритет Thread a для запуска? Не должен ли поток b дождаться окончания потока a, чтобы начать? Может кто-нибудь объяснить, как это работает?

public class Test1 extends Thread{
    static int x = 0;
    String name;

    Test1(String n) {
      name = n;
    }

    public void increment() {
        x = x+1;
        System.out.println(x + " " + name);
    }

    public void run() {
        this.increment();
    }
}

public class Main {
    public static void main(String args[]) {
        Test1 a = new Test1("a");
        Test1 b = new Test1("b");
        a.setPriority(3);
        b.setPriority(2);
        a.start();
        b.start();
    }
}

Ответы [ 3 ]

3 голосов
/ 23 октября 2019

Присвоение приоритетов не является задачей компилятора. Это планировщик ОС для планирования и передачи процессорного времени (называемого квантованием) потокам.

Планировщик также пытается запускать как можно больше потоков одновременно, исходя из доступного количества процессоров. В современных многоядерных системах чаще всего доступно более одного ядра.

Если вы хотите, чтобы поток ожидал другого, используйте некоторый механизм синхронизации.

3 голосов
/ 23 октября 2019

Не должен ли поток b ждать окончания потока a, чтобы начать?

Нет. Приоритет не блокирует выполнение потока. Он только сообщает JVM выполнить поток "в предпочтении потокам с более низким приоритетом" . Это подразумевает ожидание.

Поскольку ваш код настолько тривиален, ждать нечего. Запускается любой из двух потоков.

1 голос
/ 23 октября 2019

Почему компилятор печатает 2 a, а затем 2 b?

Удача в розыгрыше. «Приоритет» означает разные вещи в разных операционных системах, но, в общем, это всегда часть того, как ОС решает, какой поток будет запущен и какой должен ждать, когда недостаточно процессоров, чтобы запустить их оба одновременно. Если на вашем компьютере есть два или более простаивающих ЦП, когда вы запускаете эту программу, все могут запускаться. Приоритет не имеет значения в этом случае, и это просто гонка, чтобы увидеть, какой из них первым получит вызов println(...).

Поток a в вашем примере имеет преимущество, потому что программа не имеетвызывайте b.start() до тех пор, пока не вернется метод a.start(), но насколько велико это преимущество, зависит от деталей алгоритма планирования потоков ОС. Поток a может получить огромное преимущество (например, он заканчивается до того, как b даже запустится), или это может быть почти тривиальное начало.

...