2

我希望我的 Java 程序降低它的优先级,这样它就不会压倒系统。我最初的想法是使用Thread.currentThread().setPriority(5),但这似乎只是它在 JVM 中的优先级。

然后我想也许我会把它塞住并调用一个系统命令,但Thread.getId()也只是 JVM 的 id,所以我什至不知道要传递给什么进程 id renice

Java程序有没有办法做这样的事情?

4

6 回答 6

4

由于我们必须以依赖于平台的方式执行此操作,因此我从 java 运行了一个 shell 进程,它改进了它的父进程。父进程恰好是我们的 java 进程。

import java.io.*;

public class Pid
{
  public static void main(String sArgs[])
    throws java.io.IOException, InterruptedException
  {
    Process p = Runtime.getRuntime().exec(
      new String[] {
        "sh",
        "-c",
        "renice 8 `ps h -o ppid $$`"
        // or: "renice 8 `cat /proc/$$/stat|awk '{print $4}'`"
      }
      );
    // we're done here, the remaining code is for debugging purposes only
    p.waitFor();
    BufferedReader bre = new BufferedReader(new InputStreamReader(
      p.getErrorStream()));
    System.out.println(bre.readLine());
    BufferedReader bro = new BufferedReader(new InputStreamReader(
      p.getInputStream()));
    System.out.println(bro.readLine());
    Thread.sleep(10000);
  }
}

顺便说一句:你是 jEdit 的 Brad Mace 吗?很高兴见到你。

于 2012-10-14T20:58:31.547 回答
4

如果您的程序是唯一正在运行的 java 程序,那么您可以运行

renice +5 `pgrep java`
于 2012-08-22T01:16:07.480 回答
2

除了 renice - 您还可以使用 ionice 命令。例如 :

ionice -c 3 -n 7 -p PID
于 2012-08-22T01:18:41.970 回答
2

另请查看https://github.com/jnr/jnr-posix/

这个 POSIX 库应该允许您使用一些 Linux Posix Nice功能,例如...

https://github.com/jnr/jnr-posix/blob/master/src/main/java/jnr/posix/LibC.java为OS级别setPriority(),即setpriority(2)

jnr-posix 也在 Maven 中。

于 2014-08-20T16:50:25.163 回答
1

利用:

nice --adjustment=5 java whatever

只需一步即可运行您的 java 程序并分配优先级。

于 2012-08-22T04:15:21.167 回答
0

我的建议是从 bash 脚本或启动/停止服务脚本调用您的 Java 应用程序,然后在启动后找到进程 ID 并对其进行修改。

于 2012-08-22T01:19:50.073 回答