2012-03-20 52 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的实时扩展,可能是您在寻找的内容。