了解 Java 的原生线程和 jvm

2022-09-01 02:36:59

我知道jvm本身就是一个将java可执行文件的字节码转换为本机机器代码的应用程序,但是当使用本机线程时,我有一些问题似乎无法回答。

  • 每个线程是否都创建自己的 jvm 实例来处理其特定执行?
  • 如果不是,那么jvm是否必须有某种方法来调度它接下来将处理哪个线程,如果是这样,这难道不会使java的多线程性质变得无用,因为一次只能运行一个线程吗?

答案 1

每个线程是否都创建自己的 JVM 实例来处理其特定执行?

不。它们在同一个 JVM 中执行,以便(例如)它们可以共享字段的对象和值。static


如果不是,那么JVM是否必须有某种方法来调度它接下来将处理的线程。

Java 中有两种线程实现。本机线程映射到由主机操作系统实现的线程抽象上。操作系统负责本机线程调度和时间切片。

第二种线程是“绿色线程”。这些由JVM本身实现和管理,JVM实现线程调度。自 Java 1.2 以来,Sun /Oracle JVM 一直不支持 Java 绿色线程实现。(请参阅绿色线程与非绿色线程)


如果是这样的话,这难道不会使Java的多线程性质变得毫无用处,因为一次只能运行一个线程吗?

我们现在谈论的是绿色线程,从Java的角度来看,这(仅)具有历史意义。

  • 绿色线程的优点是,在非 I/O 情况下,调度和上下文切换速度更快。(基于在 Linux 2.2 上使用 Java 进行的测量;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.9238)

  • 对于纯绿色线程,N 个编程语言线程映射到单个本机线程。在此模型中,您不会获得真正的并行执行,如前所述。

  • 在混合线程实现中,N 个编程语言线程映射到 M 个本机线程(其中 N > M)。在此模型中,进程内线程调度器负责将绿色线程调度到本机线程调度,并且您获得真正的并行执行(如果 M > 1);请参阅 https://stackoverflow.com/a/16965741/139985

但即使使用纯绿色线程,您仍然可以获得并发性。控制切换到另一个线程,一个线程阻塞 I/O 操作,获取一个锁,依此类推。此外,JVM的运行时可以实现周期性线程抢占,以便CPU密集型线程不会独占(单个)内核而排除其他线程。


答案 2

每个线程是否都创建自己的 jvm 实例来处理其特定执行?

不可以,在 JVM 中运行的应用程序可以有许多线程,这些线程都存在于该 JVM 实例中。

如果不是,那么jvm是否必须有某种方法来调度它接下来将处理的线程...

是的,JVM 有一个线程调度程序。线程调度有许多不同的算法,使用哪一种取决于JVM供应商。(通常,调度是一个有趣的话题。

...如果是这样,这难道不会使java的多线程性质变得无用,因为一次只能运行一个线程吗?

我不确定我是否理解你问题的这一部分。这就是线程化的要点。您通常比 CPU 有更多的线程,并且您希望一次运行多个内容。线程化允许您通过确保它忙于处理一个线程而另一个线程正在等待I / O,或者由于其他原因不忙而充分利用CPU。