Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程与OS线程_Java_Multithreading_Operating System_Interpreter - Fatal编程技术网

Java线程与OS线程

Java线程与OS线程,java,multithreading,operating-system,interpreter,Java,Multithreading,Operating System,Interpreter,看起来我把Java线程/OS线程和解释语言搞砸了 在开始之前,我确实理解绿色线程是Java线程,其中线程由JVM负责,整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上,它是无用的 现在我的问题是。我有两个线程A和B。每个线程有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被分配一个本机OS线程来运行,该线程可以在不同的CPU上运行,但由于Java被解释,这些线程将需要反复与JVM交互,才能将字节码转换为机器指令?我说得对吗?如果是的话,Java线程比

看起来我把Java线程/OS线程和解释语言搞砸了

在开始之前,我确实理解绿色线程是Java线程,其中线程由JVM负责,整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上,它是无用的

现在我的问题是。我有两个线程A和B。每个线程有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被分配一个本机OS线程来运行,该线程可以在不同的CPU上运行,但由于Java被解释,这些线程将需要反复与JVM交互,才能将字节码转换为机器指令?我说得对吗?如果是的话,Java线程比小型程序不会有很大的优势吗

一旦热点编译了这两个执行路径,这两个执行路径都可以和本机线程一样好吗?我说得对吗

[编辑]:另一个问题是,假设您有一个Java线程的代码不是JIT编译的,您创建该线程并启动它?OS线程和JVM如何交互以运行该字节码

谢谢

整个Java进程只作为一个操作系统线程运行

事实并非如此。因此,我们经常看到,Java线程实际上是本机OS线程,多线程Java应用程序实际上利用了多核处理器或多处理器平台

一个常见的建议是使用线程池,其中线程数与内核数成比例(系数1-1.5)。这是另一个提示,JVM不限于单个OS线程/进程


来自wkipedia:

在Java1.1中,绿色线程是JVM使用的唯一线程模型,至少在Solaris上是如此。由于绿色线程与本机线程相比有一些限制,后续Java版本放弃了绿色线程,转而支持本机线程


现在,回到2010年,Java 7正在开发中,Java 8正在计划中——我们真的对历史上的“绿色线程”感兴趣吗?

线程和运行字节码是两个独立的问题。JVM在没有线程本机支持的平台上使用绿色线程。(我不知道哪个平台不支持线程)

字节码由JVM实时解释并在本机平台上执行。JVM决定什么是最流行的代码片段,并对这些片段执行所谓的即时编译,因此它不必一次又一次地编译它们。这与线程无关。例如,如果有一个线程在循环中执行相同的代码片段,那么这个片段将由即时编译器缓存

底线:不要担心性能和线程。Java足够强大,可以运行您正在编写的所有代码

每个线程都将获得一个本机操作系统 要运行的线程,该线程可以在 不同的CPU,但因为Java是 这些线程将需要 再次与JVM交互并 再次将字节码转换为 机器指令?我说得对吗

你在混合两种不同的东西;虚拟机完成的JIT和虚拟机提供的线程支持。在内心深处,您所做的一切都会转换为某种本机代码。使用线程的字节码指令与访问线程的JIT代码没有什么不同

如果是,则比较小的Java程序 线程不会是一个很大的优势

在这里定义“小”。对于寿命较短的进程,是的,线程并没有造成太大的区别,因为您的顺序执行足够快。请注意,这同样取决于要解决的问题。对于UI工具包,无论应用程序有多小,都需要某种线程/异步执行来保持UI的响应性

当您有可以并行运行的东西时,线程也很有意义。一个典型的例子是在线程中执行大量IO,在另一个线程中执行计算。您真的不想仅仅因为主线程在执行IO时被阻止而阻止处理

一旦Hotspot编译了这两个 执行路径都可以是 本机线程?我说得对吗

请看我的第一点

线程真的不是灵丹妙药,尤其是当涉及到“使用线程使代码运行更快”的常见误解时。一点阅读和经验将是你最好的选择。我能推荐你买一份吗?:-)


@桑杰:事实上,现在我可以重新定义我的 问题。如果我有一根线 代码还没有被JIT化 操作系统线程执行它

我再说一遍,线程是一个与JIT完全不同的概念。让我们试着用简单的术语来看程序的执行:

java pkg.MyClass->VM方法 待运行->开始执行 逐行方法的字节代码-> 将每个字节码指令转换为 其本机对应->指令 由操作系统执行->执行的指令 用机器

当JIT开始时:

java pkg.MyClass->VM方法 要运行的已JIT的-> 找到关联的本机代码 对于该方法->指令 由操作系统执行->执行的指令 用机器

正如您所看到的,无论您遵循何种路径,VM指令都必须在某个时间点映射到其本机对应项。本机代码是否被存储以供进一步重用,或者在发生其他事情(优化,记得吗?)时被丢弃

因此,为了回答您的问题,无论何时编写线程代码,都会将其转换为本机代码并由操作系统运行。翻译是即时完成还是在那个时间点查阅是一个完全不同的问题

  • 一些Java实现可能会创建 就像你描述的那样 (JVM在虚拟机上进行的调度) 单个本机线程),但正常 Java在PC上的实现 骡子