我正在制作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端创建工作线程然后立即返回的唯一方法!?!?
答案 0 :(得分:4)
您只有一个为您创建的“主要”主题。
我怀疑你打算在新线程中调用start();
调用run();
,而不是重用当前线程。
答案 1 :(得分:0)
我还要补充一点,JNI没有序列化,你可以从多个线程调用。