来自不同Java线程的JNI本机调用是否顺序化?
我正在制作一个WindowsJNI.dll。我试图确定JVM是否能够对同一个本机函数进行并发调用。以下是我编写的Java代码:来自不同Java线程的JNI本机调用是否顺序化?,java,windows,multithreading,concurrency,java-native-interface,Java,Windows,Multithreading,Concurrency,Java Native Interface,我正在制作一个WindowsJNI.dll。我试图确定JVM是否能够对同一个本机函数进行并发调用。以下是我编写的Java代码: public class TestThreads implements Runnable { public void run() { MyJNIClass.f(); // Call 'native' static member function } public static void main(String[] args
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();
}
}
本机函数的输出表明所有调用都从同一Win32线程运行:
5196,0xfffffffe5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xfffffffe
5196,0xFFFFFFFFFE
5196,0xFFFFFFFFFFFE
…每一行在前一行之后大约半秒弹出
那么,让本机端使用多个线程(如JVM)在本机/DLL端创建工作线程,然后立即返回的唯一方法是什么呢 您只有一个为您创建的“main”线程
我怀疑您打算调用
start()代码>调用run()在新线程中编码>,而不是重用当前线程。您只有一个为您创建的“main”线程
我怀疑您打算调用start()代码>调用run()代码>在一个新线程中,而不是重用当前线程。我还想添加,JNI不是序列化的,你可以从多个线程调用。我还想添加,JNI不是序列化的,你可以从多个线程调用。哦,天哪,我觉得很愚蠢——我希望没有人因为我的无知而贬低我!当我用start()
替换run()
时,我在Windows DLL端看到了不同的线程。因此,基本上,我以前在Java端不是多线程的,更不用说Windows端了。万分感谢。哦,老兄,我觉得自己很傻吗?我希望没有人因为我的无知而贬低我!当我用start()
替换run()
时,我在Windows DLL端看到了不同的线程。因此,基本上,我以前在Java端不是多线程的,更不用说Windows端了。非常感谢。你要找的术语是“顺序化”,而不是“序列化”,现在它的意思完全不同。你要找的术语是“顺序化”,而不是“序列化”,现在它的意思完全不同。
#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);
}
}