Tra*_*ker 30 java multithreading 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密集型线程不会独占(单个)核心而排除其他线程
每个线程都创建自己的jvm实例来处理它们的特定执行吗?
不,您在JVM中运行的应用程序可以包含许多线程,这些线程都存在于JVM的该实例中.
如果没有那么jvm必须有一些方法来安排它将接下来处理哪个线程...
是的,JVM有一个线程调度程序.线程调度有许多不同的算法,使用哪种算法依赖于JVM供应商.(一般来说,调度是一个有趣的话题.)
...如果这样不会导致java的多线程性质无用,因为一次只能运行一个线程?
我不确定我理解你问题的这一部分.这是一种线程化的观点.您通常拥有比CPU更多的线程,并且您希望一次运行多个线程.线程允许您通过确保它忙于处理一个线程而另一个线程正在等待I/O,或者由于某些其他原因不忙而使您的CPU充分利用它.
小智 6
Java线程可以一对一映射到内核线程.但事实并非如此.可能有n个内核线程运行m个java线程,其中m可能比n大得多,并且n应该大于处理器的数量.JVM本身启动n个内核线程,并且每个线程都选择一个java线程并运行它一段时间,然后切换到其他一些java线程.操作系统选择内核线程并将它们分配给cpu.因此可能会在几个级别上进行线程调度.您可能有兴趣看看GO编程语言,其中有数千个所谓的"Goroutines"由几十个线程运行.
| 归档时间: |
|
| 查看次数: |
21510 次 |
| 最近记录: |