是否使用Runtime.exec/ProcessBuilder.Start以低优先级启动Java进程?

是否使用Runtime.exec/ProcessBuilder.Start以低优先级启动Java进程?,java,windows,processbuilder,windows-task-scheduler,Java,Windows,Processbuilder,Windows Task Scheduler,我正在尝试使用ProcessBuilder类通过Java启动一个外部进程,这非常有效。当前正在使用以下命令运行: new ProcessBuilder("java", "-jar", jarfile, args); 我想做的就是这样,但是以低优先级启动流程。我的程序目前只在Windows上运行,因此我可以使用特定于窗口的解决方案。一些研究建议我使用“start”命令,但当我尝试从Java执行此操作时,它会给出一个异常,表示这是一个无法识别的命令(同一命令在cmd.exe中工作) 是否有人知道如

我正在尝试使用ProcessBuilder类通过Java启动一个外部进程,这非常有效。当前正在使用以下命令运行:

new ProcessBuilder("java", "-jar", jarfile, args);
我想做的就是这样,但是以低优先级启动流程。我的程序目前只在Windows上运行,因此我可以使用特定于窗口的解决方案。一些研究建议我使用“start”命令,但当我尝试从Java执行此操作时,它会给出一个异常,表示这是一个无法识别的命令(同一命令在cmd.exe中工作)

是否有人知道如何从Java启动进程(如果需要,特定于Windows),优先级低于正常值?

使用。它依赖于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");

因为
start
是不可执行的,但是
cmd.exe的内部命令
我唯一能想到的是将其包装在.bat中,并在bat文件中使用start。我想你的意思是.cmd而不是。bat@OpDeCirkel,我有个问题。我从来不知道start命令会影响进程优先级。如果我想拥有管理员访问权限,那么假设我在提升的cmd行上,那么如果我使用start jar file,那么我的文件也将以低优先级运行,但具有提升的权限,对吗?当这确实按照请求以低优先级运行进程时,它会在进程对象和实际java负载之间创建一个断开连接。这意味着使用/C时,它似乎会立即完成(允许拾取新作业,从而导致大量垃圾邮件),或者使用/K时,它会持续存在,并且即使有效负载已完成,也似乎永远不会完成。通过添加/wait到start命令并删除/b,可以恢复预期的运行行为,但是,进程。销毁()方法仍然无效。标准管理员回答#1在我的计算机上有效。查看我的编辑。也许你的第三方应用忽略了杀戮信号——这是另一个问题的主题。如何防止在windows中阻塞进程的终止信号。替换为“启动前”以使此输出更清晰。进程上的销毁不一定会终止子进程。使用winp库应提供更好的解决方案: