每个线程都将被赋予一个本机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
运行。无论是即时完成翻译还是在那个时间点进行翻译都是完全不同的问题。



