2012-03-20 1 views
2

私はScientific Linuxボックスのリアルタイムプロパティに設定するJavaスレッドの優先順位を変更しようとしている小さなテストを作成しようとしています。JavaのJNI呼び出しを使用してスレッドの優先順位を変更する

これは、JNI呼び出しを使用して行う必要があり、Thread.MAX_PRIORITYまたはThread.MIN_PRIORITYを使用すると、リアルタイム優先順位にマップされません。

私のネイティブコードから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からネイティブにジャンプすると、スレッドの切り替えはありません。ネイティブコードでは、現在のスレッドはジャンプ前に実行されていたものと同じOSスレッドです。ネイティブコード中に現在のスレッドに今まで何をしたいのですか?変更が継続しているかどうかを確認するためにテストする必要がある場合は、JNIが戻って変更チェッカーを実行した後にネイティブに戻ります。

-1

は、JDK 1.5以降、あなたが求めるいずれかになります long Thread#getId()方法があります。以下は、私のJavaプログラムです。 このメソッドによって返された結果を、生成されたスレッドダンプのnid(ネイティブID)と比較して比較します(ダンプはkill -3 java_pidによって生成できます)。

UPDATEと表示されます。getId()は、JVMの内部で、OSに接続されていない他のIDを返します。

でも、JVMバックの背後にあるスレッドの優先度を変更することをお勧めします。あなたが探しているかもしれないJava用のReal-Time拡張機能があります。

関連する問題