2

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 ...






...そして、これらの各行は、前の行から約 0.5 秒後に表示されます。

したがって、ネイティブ側で JVM のような複数のスレッドを使用して、ネイティブ/DLL 側でワーカー スレッドを作成し、すぐに戻るようにする唯一の方法です!?!?

4

2 に答える 2

4

あなたのために作成された「メイン」のスレッドは 1 つだけです。

現在のスレッドを再利用するのではなく、新しいスレッドでstart();which 呼び出しを呼び出すつもりだったのではないかと思います。run();

于 2013-06-20T00:01:48.120 に答える
0

また、JNIはシリアル化されていないため、複数のスレッドから呼び出すことができます。

于 2013-06-20T05:42:31.483 に答える