- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我知道 jvm 本身就是一个将 java 可执行文件的字节码转换为 native 机器码的应用程序,但是当使用 native 线程时,我有一些我似乎无法回答的问题。
最佳答案
Does every thread create their own instance of the JVM to handle their particular execution?
没有。它们在同一个 JVM 中执行,以便(例如)它们可以共享 static
字段的对象和值。
If not then does the JVM have to have some way to schedule which thread it will handle next
Java 中有两种线程实现。 native 线程被映射到由主机操作系统实现的线程抽象。操作系统负责本地线程调度和时间片。
第二种线程是“绿色线程”。这些由 JVM 本身实现和管理,JVM 实现线程调度。自 Java 1.2 以来,Sun/Oracle JVM 不再支持 Java 绿色线程实现。 (见 Green Threads vs Non Green Threads)
If so wouldn't this render the multi-threaded nature of Java useless since only one thread can be ran at a time?
我们现在谈论的是绿色线程,从 Java 的角度来看,这(仅)具有历史意义。
绿色线程的优点是在非 I/O 情况下调度和上下文切换更快。 (基于在 Linux 2.2 上使用 Java 进行的测量;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.9238)
使用纯绿色线程,N 个编程语言线程被映射到一个本地线程。正如您所指出的,在此模型中,您不会获得真正的并行执行。
在混合线程实现中,N 个编程语言线程被映射到 M 个 native 线程(其中 N > M)。在此模型中,进程内线程调度程序负责将绿色线程调度到本地线程,并且您可以获得真正的并行执行(如果 M > 1);见 https://stackoverflow.com/a/16965741/139985 .
但即使使用纯绿色线程,您仍然可以获得并发性。控制被切换到另一个线程,一个线程在 I/O 操作上阻塞,获取锁等等。此外,JVM 的运行时可以实现周期性线程抢占,这样 CPU 密集型线程就不会独占(单个)内核而排斥其他线程
关于java - 了解java的 native 线程和jvm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653458/
我是一名优秀的程序员,十分优秀!