Изменение приоритета потока с помощью вызова JNI в Java - PullRequest
2 голосов
/ 20 марта 2012

Я пытаюсь написать небольшой тест, в котором я пытаюсь изменить приоритет потока 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 ]

5 голосов
/ 20 марта 2012
How can i get access to my java thread from my native code?

При переходе с Java на нативный через JNI переключение потоков не происходит.Когда вы находитесь в собственном коде, текущий поток является тем же потоком ОС, который выполнялся до перехода.Делайте то, что вы хотите с текущим потоком, пока в нативном коде.Если вам нужно проверить, сохранились ли ваши изменения, вернитесь к исходному состоянию после того, как JNI вернется, чтобы запустить любые проверки изменений.

0 голосов
/ 20 марта 2012

Начиная с JDK 1.5, есть метод long Thread#getId(), который может быть тем, который вы ищете. Чтобы проверить, сравните результат, возвращаемый этим методом, с nid (собственный идентификатор) из созданного дампа потока ( свалка может быть произведена kill -3 java_pid).

ОБНОВЛЕНИЕ Кажется, getId() возвращает какой-то другой идентификатор, внутренний для JVM и не связанный с ОС.

Хотя, не уверен, что изменение приоритета потока позади JVM - хорошая идея. Есть некоторое расширение в реальном времени для Java, которое может быть тем, что вы ищете.

...