理解java的本机线程和jvm

Tra*_*ker 30 java multithreading jvm

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

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

Ste*_*n C 30

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

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


如果没有,那么JVM必须有一些方法来安排它接下来要处理的线程

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

第二种线程是"绿色线程".这些由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); 请参阅/sf/answers/1187601901/.

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


Bil*_*ard 8

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

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

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

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

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

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

  • “是的,JVM有一个线程调度程序。用于线程调度的算法有很多,而所使用的算法取决于JVM供应商。”我认为这里存在误导,因为如果Java线程创建了本机线程(不是绿色线程) ),那么JVM不需要调度,也不需要调度,因为OS是通过上下文切换来实现的。我对吗?如果我错了,请纠正我。 (2认同)

小智 6

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