使用Java中的JNI调用更改线程优先级

时间:2012-03-20 18:49:01

标签: java multithreading java-native-interface

我正在尝试编写一个小测试,我试图更改java线程的优先级,将其设置为我的Scientific Linux盒子上的实时属性。

我认为这需要使用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();
        }
    }

} 

2 个答案:

答案 0 :(得分:5)

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

当您通过JNI从Java跳转到本机时,没有线程切换。一旦使用本机代码,当前线程与跳转前执行的OS线程相同。在本机代码中执行您想要的当前线程。如果您需要测试以确定您的更改是否仍然存在,请在JNI返回后运行任何更改检查器后跳回本机。

答案 1 :(得分:-1)

从JDK 1.5开始,有long Thread#getId()方法可以是你寻找的方法。要检查,请将此方法返回的结果与nid(本机ID)进行比较来自生成的线程转储(转储可以由kill -3 java_pid生成)。

UPDATE 似乎getId()返回JVM内部的其他内容,但未与操作系统连接。

但是,不确定是否更改JVM背后的线程优先级是个好主意。有一些Java的实时扩展,可能就是你想要的。