2012-08-22 21 views
1

我希望我的Java程序降低它的優先級,因此它不會壓倒系統。我最初的想法是使用Thread.currentThread().setPriority(5),但這似乎只是它在JVM中的優先級。在Linux上運行的Java程序設置好的價值

然後我想也許我會搞砸它,並調用系統命令,但Thread.getId()也僅僅是JVM的ID,所以我甚至不知道什麼進程ID傳遞給renice

有沒有辦法讓Java程序做這樣的事情?

+0

相關問題:[跨平臺的方式來改變java進程優先級](http://stackoverflow.com/q/2865610/772981),沒有正面答案。 – Jarekczek

回答

4

如果你的程序是唯一正在運行的Java程序,那麼你就可以運行

renice +5 `pgrep java` 
+0

這假定[進程的好壞影響Java線程優先級](http://stackoverflow.com/questions/43786492/does-nice-affect-the-priority-of-java-threads)。 – Raedwald

2

除了使用renice - 你也可以使用ionice COMAND。例如:

ionice -c 3 -n 7 -p PID 
+0

這仍然需要知道進程ID –

0

我的建議是從bash腳本或啓動/停止服務腳本調用您的java應用程序,然後在啓動並找到它之後找到進程ID。

1

用途:

nice --adjustment=5 java whatever 

運行Java程序,並在短短的一個步驟分配優先級。

3

因爲我們必須以平臺依賴的方式來完成它,所以我從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?很高興見到你。

+0

爲我工作,謝謝! –