Запустить процесс Java с низким приоритетом, используя Runtime.exec/ProcessBuilder.start?

Я пытаюсь запустить внешний процесс через Java, используя класс ProcessBuilder, и это работает. В настоящее время работает с помощью команды:

new ProcessBuilder("java", "-jar", jarfile, args);

То, что я хотел бы сделать, это только это, но запустить процесс с низким приоритетом. Моя программа в настоящее время работает только в Windows, поэтому мне подходит решение для конкретного окна. Некоторые исследования предполагают, что я использую команду «Пуск», но когда я пытаюсь сделать это из Java, выдается исключение, говорящее, что это нераспознанная команда (та же команда работает из cmd.exe).

Кто-нибудь знает, как запустить процесс из Java (при необходимости для Windows) с приоритетом belownormal?


person Andrew    schedule 03.06.2011    source источник
comment
потому что start не исполняемый файл, а внутренняя команда cmd.exe   -  person Op De Cirkel    schedule 03.06.2011
comment
Единственное, что я могу придумать, это обернуть его в .bat, а в файле bat использовать start   -  person Op De Cirkel    schedule 03.06.2011
comment
Я думаю, вы имели в виду .cmd вместо .bat   -  person rakslice    schedule 09.08.2011
comment
@OpDeCirkel, у меня вопрос. Я никогда не знал о команде запуска, влияющей на приоритет процесса. Если я хочу иметь доступ администратора, допустим, я нахожусь в строке cmd с повышенными правами, тогда, если я использую start jar-file, мой файл также будет работать с низким приоритетом, но с повышенными правами, верно?   -  person Johnydep    schedule 31.01.2012


Ответы (1)


Используйте команду запуска< /а>. Это зависит от Windows, но делает то, что вам нужно. Я прочитал, что для этого нет межплатформенного способа.

ProcessBuilder pb = new ProcessBuilder("cmd", "/C start /B /belownormal javaws -version");
System.out.println("Before start");
Process start = pb.start();

Можно даже читать потоки входных и конечных ошибок.

Ждать:

ProcessBuilder pb = new ProcessBuilder("cmd", "/C start /B /belownormal /WAIT javaws -sdasd");
System.out.println("Before start");
Process start = pb.start();
start.waitFor();
System.out.println("Done");

Для преждевременного уничтожения:

ProcessBuilder pb = new ProcessBuilder("cmd", "/C start /B /belownormal /WAIT javaws -sdasd");
System.out.println("Before start");
Process start = pb.start();
start.destroy();
start.waitFor();

System.out.println("Done");
person teodozjan    schedule 03.06.2011
comment
Хотя это действительно запускает процесс с низким приоритетом в соответствии с запросом, это создает разрыв между объектом Process и фактической полезной нагрузкой Java. Это означает, что с /C он, кажется, завершается немедленно (позволяя взять новую работу, что приводит к массовому спаму работы), или с /K он сохраняется и, кажется, никогда не завершается, даже если полезная нагрузка завершена. - person Andrew; 05.06.2011
comment
Ожидаемое поведение при запуске можно восстановить, добавив /wait к команде запуска и удалив /b, однако метод Process.destroy() остается неэффективным. - person Andrew; 05.06.2011
comment
Стандартный ответ администратора №1 Работает на моем компьютере. Смотрите мои правки. Возможно, ваше стороннее приложение игнорирует сигнал уничтожения, тогда это тема для другого вопроса. Как предотвратить блокировку сигнала уничтожения для процесса в Windows. - person teodozjan; 06.06.2011
comment
Заменено на Перед началом, чтобы сделать вывод более понятным. - person teodozjan; 15.06.2011
comment
Уничтожение процесса не обязательно приведет к уничтожению подпроцесса. Лучше использовать библиотеку winp: winp.kohsuke.org - person parasietje; 14.08.2013