Поток с более высоким приоритетом получает тот же объем процессора, что и более низкий приоритет?
Ниже мой код.
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,