JVM线程将始终保持它们到OS线程的映射吗

Kel*_*len 3 java multithreading jna

我正在编写一个使用JNA将Java的工作委派给本机C ++库的服务。C ++库对计算量大的任务进行异步调用,然后在该任务完成时获得回调(在不同的OS线程上)。我想将这项工作的结果路由回JVM中的正确线程。

我想知道的是,能否保证JVM线程ID始终具有与本机thread_id的一对一映射?即如果我通过C在C ++中记录线程ID

std::this_thread::get_id()
Run Code Online (Sandbox Code Playgroud)

然后启动一些昂贵的工作并在cv上进行阻止,一旦工作完成,线程仍将存在,并且我将能够正确地将结果返回给JVM。是否有任何像JIT,GC这样的幕后JVM都能正常工作,或者会停止收集世界呢?

Ste*_*n C 5

JLS,JVM规范或Javadocs中未指定答案。

实际上,它可能是特定于平台的。例如,在Solaris的JVM中,可以(或可以)将用户空间线程映射到内核空间线程:看到这个文件。目前尚不清楚本机线程ID的含义。

那么thread_id,对于您所使用的JVM,线程的本机会是常量吗?

只有一种方法可以确保:下载JVM源代码并进行检查。

警告:这太可怕了!

(并且您可能应该以此为暗示,您不应该做这种事情……如果您必须求助于StackOverflow询问它是否可以工作!)