【问题标题】:Start a Java process at low priority using Runtime.exec / ProcessBuilder.start?使用 Runtime.exec / ProcessBuilder.start 以低优先级启动 Java 进程?
【发布时间】:2011-09-07 14:26:49
【问题描述】:

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

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

我想做的只是这个,但是以低优先级启动进程。我的程序目前仅在 Windows 上运行,因此我可以使用特定于窗口的解决方案。一些研究建议我使用“start”命令,但是当我尝试从 Java 执行此操作时,它会给出一个异常,说它是一个无法识别的命令(相同的命令适用于 cmd.exe)。

有谁知道如何以belownormal 优先级从 Java 启动进程(如果需要,Windows 特定)?

【问题讨论】:

  • 因为start是不可执行的,而是cmd.exe的内部命令
  • 我唯一能想到的就是将它包装在 .bat 中并在 bat 文件中使用 start
  • 我认为你的意思是 .cmd 而不是 .bat
  • @OpDeCirkel,我有一个问题。我从来不知道影响进程优先级的启动命令。如果我想拥有管理员访问权限,假设我在提升的 cmd 行上,那么如果我使用 start jar-file,那么我的文件也将以低优先级但具有提升的权限运行,对吗?

标签: java windows processbuilder windows-task-scheduler


【解决方案1】:

使用start command。它依赖于 Windows,但可以满足您的需要。我have read 没有跨平台的方式。

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");

【讨论】:

  • 虽然这确实按照请求以低优先级运行进程,但它会在 Process 对象和实际 java 有效负载之间创建断开连接。这意味着使用 /C 它似乎会立即完成(允许拾取新工作导致大量垃圾工作),或者使用 /K 它会持续存在并且即使有效负载已经完成,它似乎也永远不会完成。
  • 在启动命令中添加/wait,去掉/b可以恢复预期的运行行为,但是Process.destroy()方法仍然无效。
  • 标准管理员回答 #1 适用于我的计算机。请参阅我的编辑。也许您的第三方应用程序忽略了终止信号 - 而这是另一个问题的主题。如何防止阻塞windows中进程的终止信号。
  • 替换为“Before start”以使输出更清晰。
  • 进程的销毁不一定会杀死子进程。使用 winp 库应该会提供更好的解决方案:winp.kohsuke.org
猜你喜欢
  • 2012-02-21
  • 2018-04-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多