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

在Java中使用JNI调用更改线程优先级,java,multithreading,java-native-interface,Java,Multithreading,Java Native Interface,我正在尝试编写一个小测试,在这个测试中,我试图更改java线程的优先级,以便在我的Scientific Linux机器上将其设置为real time属性 我认为这需要使用JNI调用来完成,因为使用Thread.MAX\u PRIORITY或Thread.MIN\u PRIORITY永远不会将其映射到实时优先级 如何从本机代码访问java线程让我感到困惑。以下是我的java程序: public class ThreadPriorityTest implements Runnable {

我正在尝试编写一个小测试,在这个测试中,我试图更改java线程的优先级,以便在我的Scientific Linux机器上将其设置为real time属性

我认为这需要使用JNI调用来完成,因为使用Thread.MAX\u PRIORITY或Thread.MIN\u 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();
        }
    }

} 
公共类ThreadPriorityTest实现可运行{
公共静态int numThreads;
公开募捐{
System.out.println(“***Java:更改线程优先级”);
changePriority();
}
公共静态同步本机void changePriority();
公共静态void main(字符串[]args){
如果(args.length!=1){
System.out.println(“用法:ThreadPriorityTest”);
系统出口(0);
}
numThreads=Integer.parseInt(args[0]);
for(int i=0;i
自JDK1.5以来,就有了
长线程#getId()
方法,您可以寻找它。要进行检查,请将此方法返回的结果与生成的线程转储中的
nid
(本机id)(转储可以由
kill-3java_-pid
生成)进行比较

UPDATE似乎
getId()
返回JVM内部的、未连接到操作系统的其他id

不过,不确定在JVM后面更改线程优先级是否是个好主意。Java有一些实时扩展,这可能正是您所需要的。

自JDK 1.5以来,有一个
长线程#getId()
方法,可以是您所需要的方法。要进行检查,请将此方法返回的结果与生成的线程转储中的
nid
(本机id)(转储可以由
kill-3java_-pid
生成)进行比较

How can i get access to my java thread from my native code?
UPDATE似乎
getId()
返回JVM内部的、未连接到操作系统的其他id

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

How can i get access to my java thread from my native code?
当您通过JNI从Java跳转到本机时,没有线程切换。进入本机代码后,当前线程与跳转前执行的OS线程相同。在本机代码中对当前线程执行所需操作。如果需要测试更改是否持久,请在JNI返回后跳回本机以运行任何更改检查器

当您通过JNI从Java跳转到本机时,没有线程切换。进入本机代码后,当前线程与跳转前执行的OS线程相同。在本机代码中对当前线程执行所需操作。如果需要测试更改是否持久,请在JNI返回后跳回本机以运行任何更改检查器