Java线程与OS线程
看起来我把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线程/进程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线程比
来自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指令都必须在某个时间点映射到其本机对应项。本机代码是否被存储以供进一步重用,或者在发生其他事情(优化,记得吗?)时被丢弃 因此,为了回答您的问题,无论何时编写线程代码,都会将其转换为本机代码并由操作系统运行。翻译是即时完成还是在那个时间点查阅是一个完全不同的问题