我希望我的Java程序降低它的優先級,因此它不會壓倒系統。我最初的想法是使用Thread.currentThread().setPriority(5)
,但這似乎只是它在JVM中的優先級。在Linux上運行的Java程序設置好的價值
然後我想也許我會搞砸它,並調用系統命令,但Thread.getId()
也僅僅是JVM的ID,所以我甚至不知道什麼進程ID傳遞給renice
。
有沒有辦法讓Java程序做這樣的事情?
我希望我的Java程序降低它的優先級,因此它不會壓倒系統。我最初的想法是使用Thread.currentThread().setPriority(5)
,但這似乎只是它在JVM中的優先級。在Linux上運行的Java程序設置好的價值
然後我想也許我會搞砸它,並調用系統命令,但Thread.getId()
也僅僅是JVM的ID,所以我甚至不知道什麼進程ID傳遞給renice
。
有沒有辦法讓Java程序做這樣的事情?
如果你的程序是唯一正在運行的Java程序,那麼你就可以運行
renice +5 `pgrep java`
這假定[進程的好壞影響Java線程優先級](http://stackoverflow.com/questions/43786492/does-nice-affect-the-priority-of-java-threads)。 – Raedwald
除了使用renice - 你也可以使用ionice COMAND。例如:
ionice -c 3 -n 7 -p PID
這仍然需要知道進程ID –
我的建議是從bash腳本或啓動/停止服務腳本調用您的java應用程序,然後在啓動並找到它之後找到進程ID。
用途:
nice --adjustment=5 java whatever
運行Java程序,並在短短的一個步驟分配優先級。
因爲我們必須以平臺依賴的方式來完成它,所以我從java運行一個shell進程,並且修改它的父進程。該parrent碰巧是我們的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?很高興見到你。
爲我工作,謝謝! –
也看看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。
相關問題:[跨平臺的方式來改變java進程優先級](http://stackoverflow.com/q/2865610/772981),沒有正面答案。 – Jarekczek