Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自不同Java线程的JNI本机调用是否顺序化?_Java_Windows_Multithreading_Concurrency_Java Native Interface - Fatal编程技术网

来自不同Java线程的JNI本机调用是否顺序化?

来自不同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

我正在制作一个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)
    {
        for (int k = 0; k < 20; ++k)
            new Thread(new TestThreads()).run();
    }
}
本机函数的输出表明所有调用都从同一Win32线程运行:

5196,0xfffffffe
5196,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);
    }
}