我正在尝试编写一个小测试,我试图更改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();
}
}
}
答案 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的实时扩展,可能就是你想要的。