2012-03-20 66 views
2

我正在嘗試編寫一個小型測試,其中我正嘗試更改Java線程的優先級,以將其設置爲科學Linux框上的實時屬性。在Java中使用JNI調用更改線程優先級

我認爲這需要使用JNI調用完成,因爲使用Thread.MAX_PRIORITY或Thread.MIN_PRIORITY將永遠不會將其映射到實時優先級。

我很難過,我怎樣才能從我的本地代碼訪問我的Java線程。以下是我的java程序:

public class ThreadPriorityTest implements Runnable { 

    public static int numThreads; 

    public void run() { 
     System.out.println("***Java: Changing thread priorities"); 
     changePriority(); 
    } 

    public static synchronized native void changePriority(); 

    public static void main(String[] args) { 
     if(args.length != 1) { 
      System.out.println("Usage: ThreadPriorityTest <num_of_threads>"); 
      System.exit(0); 
     } 

     numThreads = Integer.parseInt(args[0]); 

     for(int i = 0; i < numThreads; i++) { 
      Thread t = new Thread(new ThreadPriorityTest()); 
      t.start(); 
     } 
    } 

} 

回答

5
How can i get access to my java thread from my native code? 

當您通過JNI從Java跳轉到本地時,沒有線程切換。一旦你在本地代碼中,當前線程與跳轉前執行的操作系統線程相同。在本地代碼中執行任何你想要的當前線程。如果您需要測試以確定您的更改是否持續存在,請在JNI返回以運行任何更改檢查器後跳回原生。

-1

由於JDK 1.5,有 long Thread#getId()方法可以是你尋找的人。 檢查時,將此方法返回的結果與生成的線程轉儲中的nid(本機ID)進行比較(轉儲可由kill -3 java_pid生成)。

UPDATE似乎getId()返回一些其他ID內部的JVM,並沒有連接到操作系統。

雖然,不知道如果改變JVM背後的線程優先級是個好主意。有一些適用於Java的實時擴展,可能是您在尋找的內容。