来自不同Java线程的JNI本机调用是否已按顺序排列?

时间:2013-06-19 23:56:48

标签: java windows multithreading concurrency java-native-interface

我正在制作Windows JNI .dll。我试图确定JVM是否可以对同一本机函数进行并发调用。这是我写的Java代码:

public class TestThreads implements Runnable
{
    public void run()
    {
        MyJNIClass.f(); // Call 'native' static member function
    }
    public static void main(String[] args)
    {
        for (int k = 0; k < 20; ++k)
            new Thread(new TestThreads()).run();
    }
}

在本机方面,函数MyJNIClass.f()的实现方式如下:

#include <jni.h>
#include <windows.h>
#include <iostream>

extern "C"
{
    JNIEXPORT void JNICALL Java_MyJNIClass_f(JNIEnv * env, jclass clazz)
    {
        std::cout << GetCurrentThreadId() << ", " << GetCurrentThread() << std::endl;
        Sleep(500);
    }
}

本机函数的输出表明所有调用都是从同一个Win32线程运行的:

  

5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
...

......并且这些线条中的每一条在前一条线之后大约半秒钟弹出。

这是让本机端使用多个线程(如JVM)在本机/ DLL端创建工作线程然后立即返回的唯一方法!?!?

2 个答案:

答案 0 :(得分:4)

您只有一个为您创建的“主要”主题。

我怀疑你打算在新线程中调用start();调用run();,而不是重用当前线程。

答案 1 :(得分:0)

我还要补充一点,JNI没有序列化,你可以从多个线程调用。