我理解jvm本身就是一个将java可执行文件的字节码转换为本机机器码的应用程序,但是当使用本机线程时,我有一些我似乎无法回答的问题。
答案 0 :(得分:29)
每个线程是否都创建了自己的JVM实例来处理它们的特定执行?
没有。它们在同一个JVM中执行,以便(例如)它们可以共享对象和类属性。
如果没有,那么JVM必须有一些方法来安排它将在下一个处理哪个线程
Java中有两种线程实现。本机线程映射到由主机OS实现的线程抽象。操作系统负责本机线程调度和时间切片。
第二种线程是“绿色线程”。这些由JVM本身实现和管理,JVM实现线程调度。自Java 1.2以来,Sun / Oracle JVM尚未支持Java绿色线程实现。 (见Green Threads vs Non Green Threads)
如果是这样,这不会使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密集型线程不会独占(单个)核心而排除其他线程
答案 1 :(得分:7)
每个线程都创建自己的jvm实例来处理它们的特定执行吗?
不,您在JVM中运行的应用程序可能有许多线程都存在于JVM的该实例中。
如果没有,那么jvm必须有一些方法来安排它接下来要处理的线程......
是的,JVM有一个线程调度程序。线程调度有许多不同的算法,使用哪种算法依赖于JVM供应商。 (Scheduling一般来说是一个有趣的话题。)
...如果是这样,这不会使java的多线程特性变得无用,因为一次只能运行一个线程?
我不确定我理解你问题的这一部分。这是一种线程化的观点。您通常拥有比CPU更多的线程,并且您希望一次运行多个线程。线程允许您通过确保它忙于处理一个线程而另一个线程正在等待I / O,或者由于某些其他原因而不忙而充分利用您的CPU。
答案 2 :(得分:5)
Java线程可以一对一映射到内核线程。但事实并非如此。可能有n个内核线程运行m个java线程,其中m可能比n大得多,并且n应该大于处理器的数量。 JVM本身启动n个内核线程,并且每个线程都选择一个java线程并运行它一段时间,然后切换到其他一些java线程。操作系统选择内核线程并将它们分配给cpu。因此可能会在几个级别上进行线程调度。 您可能有兴趣看看GO编程语言,其中有数千个所谓的“Goroutines”由几十个线程运行。
答案 3 :(得分:1)
Java线程映射到本机OS线程。它们与JVM本身没什么关系。