Java线程与OS线程

极客 :

看起来我已经搞砸了Java线程/ OS线程和解释性语言。

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

现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都会被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运行,但是由于解释了Java,因此这些线程将需要一次又一次地与JVM交互,以将字节码转换为机器指令?我对吗 ?如果可以,那么与较小的程序相比,Java Threads不会有很大的优势?

一旦Hotspot编译了这两个执行路径,它们都可以和本机线程一样好?我对吗 ?

[编辑]:一个替代问题可以是,假设您有一个Java线程,其代码未经JIT编译,则创建该线程并启动()吗?OS线程和JVM如何交互以运行该字节码?

谢谢

Sanjay T. Sharma:

每个线程都会被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运行,但是由于解释了Java,因此这些线程将需要一次又一次地与JVM交互,以将字节码转换为机器指令?我对吗 ?

您正在混合两种不同的东西;由VM完成的JIT和VM提供的线程支持。在内部,您所做的一切都会转换为某种本机代码。使用线程的字节码指令与访问线程的JIT代码无异。

如果可以,那么与较小的程序相比,Java Threads不会有很大的优势?

在这里定义小。对于寿命短的进程,是的,因为顺序执行速度足够快,所以线程并没有太大的不同。请注意,这再次取决于要解决的问题。对于UI工具包,无论应用程序有多小,都需要某种线程/异步执行来保持UI响应。

当您拥有可以并行运行的东西时,线程也很有意义一个典型的示例是在线程上进行大量IO,然后在另一个线程上进行计算。您确实不希望仅仅因为您的主线程在执行IO时就阻塞了处理。

一旦Hotspot编译了这两个执行路径,它们都可以和本机线程一样好?我对吗 ?

看到我的第一点。

线程确实不是灵丹妙药,尤其是对于“使用线程使此代码运行更快”的常见误解。最好的阅读和经验将是您最好的选择。我可以推荐得到这本很棒的书吗?:-)

@桑杰:事实上,我现在可以重新提出我的问题。如果我有一个线程的代码尚未JIT,那么OS线程将如何执行它?

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

java pkg.MyClass-> VM定位要运行的方法->开始逐行执行方法的字节码->将每个字节码指令转换为其本机副本->由OS执行的指令->由机器执行的指令

当JIT开始时:

java pkg.MyClass-> VM定位已JIT'ed的要运行的方法->定位该方法的关联本机代码-> OS执行的指令->机器执行的指令

如您所见,无论您遵循哪种路线,VM指令都必须在某个时间点映射到其本机副本。是存储该本机代码以供进一步重用,还是存储其他内容(优化,还记得吗?)丢弃。

因此,为回答您的问题,每当您编写线程代码时,它都会转换为本地代码并由 OS 运行无论是即时完成翻译还是在那个时间点进行翻译都是完全不同的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章