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 側でワーカー スレッドを作成し、すぐに戻るようにする唯一の方法です!?!?