如果我们尝试将本机线程永久地附加到DVM(JVM)会有什么后果?

是否可以将本机线程永久地附加到JVM(AttachCurrentThread)(或)是否更好地在需要时进行附加(调用java函数)并在工作完成后立即分离

我用上述案例编写了一个示例本机应用程序,没有发现任何差异。 但通过谷歌搜索,模糊地我才知道,当连接到JVM时,JVM的线程调度负责调度,否则OS将调度本机线程(如果没有附加)。 这是真的?

分离先前已连接的任何线程非常重要; 否则,当您调用DestroyJavaVM时程序不会退出。 – http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniref.html#attach

会有任何性能问题吗?
如果有人知道,请告诉我,这是我的重要设计方面。

感谢和问候。

永久附加本机线程时,无法退出本机线程。 当我们尝试退出本机线程而不分离时崩溃。 但是当我们分离时,本机线程能够做出优雅的退出。

除了提升性能之外,我没有遇到任何后果。

这正是我在一个应用程序中所做的事情,该应用程序在两个层之间对直接分配的ByteBuffer数据进行混洗。 我发现不断附加/分离的成本非常高,正如人们所预料的那样。 我的方法是启动一个Java管理的线程,该线程在启动时进行阻塞JNI调用,在C / C ++层中包含条件/信号样式循环(以便不吃CPU周期)。 然后,我可以在数据准备好进行处理时向下发送信号,相反,当完成艰苦工作时,我可以向Java发出信号。

 new Thread(() -> myBlockingJNICall()).start(); 

然后在C层中向下:

 #ifdef __cplusplus extern "C" { #endif // __cplusplus static JavaVM *jvm = nullptr; // captures the JVM on load JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *the_jvm, void* /*reserved*/) { jvm = the_jvm; return JNI_VERSION_1_2; // must export 1_2 to use any of the new functions, 1_1 otherwise } JNIEXPORT jboolean JNICALL Java_myBlockingJNICall(JNIEnv *env, jobject) { // loop forever waiting for work and using env for signalling // jvm is stored in case we need to manually attach (or perform more complex work requiring jvm access) return JNI_TRUE; } #ifdef __cplusplus } #endif // __cplusplus