2

システムを圧倒しないように、Java プログラムの優先度をいくらか下げたいと考えています。私の最初の考えは使用することThread.currentThread().setPriority(5)でしたが、それは単に JVM 内での優先事項のようです。

それから私はそれを握りつぶしてシステムコマンドを呼び出すかもしれないと思ったThread.getId()が、単なるJVMのIDでもあるので、どのプロセスIDを渡すかさえわからないrenice

Java プログラムでこのようなことを行う方法はありますか?

4

6 に答える 6

4

あなたのプログラムが唯一実行中のJavaプログラムである場合、あなたは実行することができます

renice +5 `pgrep java`
于 2012-08-22T01:16:07.480 に答える
4

プラットフォームに依存する方法で行う必要があるため、Java からシェル プロセスを実行すると、その親が破棄されます。親はたまたま 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 に答える
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 の便利機能を利用できるはずです...

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 プログラムを実行し、優先順位を 1 ステップで割り当てることができます。

于 2012-08-22T04:15:21.167 に答える
0

私の提案は、bash スクリプトまたはサービスの開始/停止スクリプトから Java アプリケーションを呼び出し、起動後にプロセス ID を見つけてそれを再利用することです。

于 2012-08-22T01:19:50.073 に答える