Как изменить приоритет работающего Java-процесса? - PullRequest
3 голосов
/ 05 июня 2011

В связанном вопросе мы исследовали использование ProcessBuilder для запуска внешних процессов с низким приоритетом с помощью команд, зависящих от ОС. Я также обнаружил, что если родительский процесс имеет низкий приоритет, то все его порожденные процессы запускаются с низким приоритетом. Поэтому мой новый вопрос о запуске java-файла (запускается двойным щелчком по исполняемому jar-файлу в windows) с низким приоритетом или программном изменении его приоритета во время выполнения. Я попытался изменить приоритет потока, но это не влияет на приоритет процесса Windows.

Я пробовал следующее, но это не меняет приоритет процесса в диспетчере задач

public class hello{
    public hello(){
        try{
            Thread.currentThread().setPriority(1);
            Thread.sleep(10000);    
        }catch(Exception e){e.printStackTrace();}
    }
}

Единственное, о чем я могу думать, - это запустить программу с использованием командного файла, но я бы предпочел оставить это, так сказать, в семье. Так кто-нибудь знает о способе изменения приоритета текущего процесса на основе Java? В идеале было бы неплохо иметь возможность изменить приоритет процесса в ответ на пользовательский ввод во время работы программы.

Ответы [ 3 ]

6 голосов
/ 05 июня 2011

Возможно, вы пытаетесь сделать то, что ОС делает для вас.

В Unix, под нагрузкой, каждому процессу дается небольшой отрезок времени для выполнения своей работы.Если он использует весь свой временной интервал, предполагается, что процесс связан с процессором, то приоритет снижается.Если он блокируется на IO, предполагается, что он связан с IO, и его приоритет повышается (поскольку он не использовал весь свой временной интервал)

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

3 голосов
/ 05 июня 2011

https://stackoverflow.com/questions/257859 обсуждает, как изменить приоритет потока в Windows.Я не знаю ни одного Java API для этого, поэтому вам придется использовать JNI для вызова Windows API.На вашем месте, я думаю, я бы начал с JNA , который позволит вам легко отобразить функции или найти готовую оболочку Java для API, если она есть.

0 голосов
/ 02 июля 2014

(Заголовок не относится конкретно к окнам, но теги делают. Однако я думаю, что было бы уместно знать различия.)

В общем случае планирование потоков процессов зависит от ядра, поэтомувряд ли это портативный способ сделать это.На самом деле, то, что означает приоритет, сильно варьируется.Например, в NT высокое значение 24 означает реальное время, а значение 1 означает бездействие.В Unix это наоборот: 1 - самый быстрый, а большие значения медленнее.

Конечно, Java абстрагирует эту информацию, используя .setPriority с диапазоном 1 ( низший *От 1009 *) до 10 ( наивысший ).

Что-то еще не указано, но довольно большая проблема во многих Unix-системах: По умолчанию пользователь не может увеличить приоритетпроцесс (то есть уменьшить значение nice), даже если сам пользователь уменьшил приоритет прямо перед этим.

В отличие от NT, я думаю, вы можете восстановить свой приоритет до приоритета по умолчанию.

Проще говоря: .setPriority может работать на Windows, но, скорее всего, не будет работать на Unix.

...