Поток с более высоким приоритетом получает тот же объем процессора, что и более низкий приоритет?

Ниже мой код.

public class Test {
    public static void main(String[] args) throws InterruptedException {
        PrintingThread a = new PrintingThread("A");
        a.setPriority(9);
        PrintingThread b = new PrintingThread("B");
        b.setPriority(1);
        a.start();
        b.start();
    }

    static class PrintingThread extends Thread {
        private int i = 0;
        private String name;

        public PrintingThread(String name) {
            super();
            this.name = name;
        }

        @Override
        public void run() {
            while (true) {
                i++;
                if (i % 100000 == 0) {
                    System.out.println("Thread " + name + " count=" + i
                            + ". Time :" + System.currentTimeMillis());
                }
            }

        }
    }
}

Поскольку я установил более высокий приоритет для A, я ожидал, что оператор print даст более высокое значение для A, но это не так. Ниже приведен пример вывода после запуска программы некоторое время.

Thread A count=1033300000. Time :1431937330486
Thread A count=1033400000. Time :1431937330486
Thread A count=1033500000. Time :1431937330486
Thread A count=1033600000. Time :1431937330486
Thread B count=1058600000. Time :1431937330485
Thread B count=1058700000. Time :1431937330487

Я нахожусь на Ubuntu и работаю с версией Java 1.7.0-79-b15. Я запустил программу с помощью команды

taskset 0x00000001 java -jar Untitled.jar

и проверил с помощью интерфейса системного монитора, что используется только один процессор (если я выполню команду java -jar Untitled.jar используются два процессора).

Значит ли это, что нет разницы, даже если я установлю приоритет? Или что-то не так с моей программой?

1 ответ

Решение

Ваша программа в порядке.

Установка приоритета потоков - это просто подсказка основной операционной системе (из вашего кода), в которой она пытается увеличить приоритет потока. Нет никакой гарантии (даже не обязательно), что ОС сделает что-то на основе вашего звонка.

Вы можете увидеть разницу, если эта программа запускается при других обстоятельствах (загрузка процессора) или на другой платформе (но ожидаемые результаты могут быть непоследовательными).

Примечание. В системах Linux приоритеты потоков не учитываются по умолчанию. Вы должны использовать XX:ThreadPriorityPolicy возможность включить приоритет потока в Linux,

Другие вопросы по тегам