理解java的本机线程和jvm

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

  • 每个线程都创建自己的jvm实例来处理它们的特定执行吗?
  • 如果没有那么jvm必须有一些方法来安排它接下来将处理哪个线程,如果这样,这不会使java的multithreading性质无用,因为一次只能运行一个线程?

每个线程都创建自己的jvm实例来处理它们的特定执行吗?

不。它们在同一个JVM中执行,以便(例如)它们可以共享对象和类属性。

如果没有那么jvm必须有一些方法来安排它接下来将处理哪个线程,如果这样,这不会使java的multithreading性质无用,因为一次只能运行一个线程?

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

第二种线程是“绿色线程”。 这些是由JVM本身实现和管理的,JVM实现了线程调度。 Sun JVM,AFAIK不再支持绿色线程实现。

每个线程都创建自己的jvm实例来处理它们的特定执行吗?

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

如果不是那么jvm必须有一些方法来安排它将接下来处理哪个线程…

是的,JVM有一个线程调度程序。 线程调度有许多不同的算法,使用哪种算法依赖于JVM供应商。 (一般来说, 调度是一个有趣的话题。)

…如果这样不会导致java的multithreading性质无用,因为一次只能运行一个线程?

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

Java线程可以一对一映射到内核线程。 但事实并非如此。 可能有n个内核线程运行m个java线程,其中m可能比n大得多,并且n应该大于处理器的数量。 JVM本身启动n个内核线程,并且每个线程都选择一个java线程并运行它一段时间,然后切换到其他一些java线程。 操作系统选择内核线程并将它们分配给cpu。 因此可能在几个级别上进行线程调度。 您可能有兴趣看看GO编程语言,其中有数千个所谓的“Goroutines”由几十个线程运行。

Java线程映射到本机OS线程。 它们与JVM本身没什么关系。