Java中Thread的自定义实现:JNI是否可行?

时间:2010-08-13 15:04:51

标签: java multithreading

是否可以以安全/正确的方式在Java中实现自定义Thread类(使用JNI)?

假设我使用本地NewThread方法编写自己的start()类,该方法分叉执行,在分叉线程中调用run()并返回...

这可能吗? JVM会抱怨吗?根据规格它是“合法的”吗?这会破坏内存模型中的任何东西吗?它取决于特定的JVM吗?

2 个答案:

答案 0 :(得分:1)

有可能。在过去,我使用的是一个读取套接字消息的C ++库。在通过JNI初始化之后,库启动了几个pthread,它们从套接字读取数据并通过JNI在Java领域中进行调用。所说的pthreads非常深入到Java代码中。我们遇到的唯一问题是JNI接缝上的内存问题。阅读完JNI文档后,一些调试问题解决了。所以,内存模型没有问题。

不知道JVM是否会根据从JNI传入的执行来触发JIT,因此可能会在那里受到性能影响。

可行,在某些地方很棘手。如果您可以使用Java Threads,请避免这种情况。我知道我愿意。

答案 1 :(得分:1)

您的问题已在Java Native Interface Programmer's Guide and Specification, section 8.1.5中解答。

重要的问题是VM必须使用与本机代码相同的线程模型。一些首批Java VM在某些操作系统(Linux)上使用所谓的“绿色线程”来模拟线程上下文切换,因为操作系统本身不提供本机线程支持。如果您在具有本机线程支持的较新操作系统版本上使用这些旧VM中的一个,则这些“绿色线程”将无法与本机线程交互。

自Sun的JRE 1.3以来,我认为所有“普通”虚拟机都直接使用本机线程,这意味着您可以在JNI代码中自己使用本机线程,并期望一切按预期工作。