是否有可能以安全/正确的方式在Java中实现自定义Thread类(使用JNI)?
假设我用本机start()方法编写了自己的NewThread类,该方法派生执行,在派生的线程中调用run()并返回...
这有可能吗?JVM会抱怨吗?根据规范,它是“合法的”吗?这会破坏内存模型中的任何东西吗?它依赖于特定的JVM吗?
发布于 2010-08-13 23:36:55
您的问题将在Java Native Interface Programmer's Guide and Specification, section 8.1.5中得到解答。
重要的问题是,VM必须使用与本机代码中相同的线程模型。一些最早的Java在一些操作系统(Linux)上使用所谓的“绿色线程”来模拟线程上下文切换,因为操作系统本身并不提供本机线程支持。如果您要在具有本机线程支持的较新操作系统版本上使用这些旧VM之一,则这些“绿色线程”将无法与本机线程交互。
从Sun的JRE 1.3开始,我认为所有“普通”VM都直接使用本机线程,这意味着您可以在JNI代码中使用本机线程,并期望一切都能按您期望的那样工作。
发布于 2010-08-13 23:35:42
这是可能的。在过去,我使用的是一个为套接字读取消息的C++库。在通过JNI进行初始化之后,该库启动了两个pthread,它们从套接字读取数据,并通过JNI在Java领域进行调用。上面提到的pthread深入到了Java代码中。我们唯一的问题是JNI seam的内存问题。在阅读了JNI文档并进行了一些调试之后,问题就解决了。所以,内存模型没有问题。
不知道JVM是否会基于从JNI传入的执行触发JIT,因此可能会影响性能。
可行,在某些地方很棘手。如果您可以使用Java Thread,请避免这种情况。我知道我会的。
https://stackoverflow.com/questions/3478150
复制相似问题