Gee*_*eek 30 java multithreading interpreter operating-system
看起来我已经搞砸了Java Threads/OS Threads和Interpreted语言.
在开始之前,我确实理解绿色线程是Java线程,其中线程由JVM处理,整个Java进程仅作为单个OS线程运行.因此在多处理器系统上它是无用的.
现在我的问题是.我有两个主题A和B.每个都有10万行独立代码.我在多处理器系统上的Java程序中运行这些线程.每个线程都将被赋予一个本机操作系统线程到RUN,它可以在不同的CPU上运行但是由于Java被解释,这些线程将需要一次又一次地与JVM交互以将字节代码转换为机器指令?我对吗 ?如果是,那么对于较小的程序,Java Threads不会是一个很大的优势吗?
一旦Hotspot编译这两个执行路径,它们都可以像原生线程一样好吗?我对吗 ?
[编辑]:另一个问题是,假设您有一个Java代码未编译的Java线程,您创建该Thread并启动()它?操作系统线程和JVM如何交互以运行该字节码?
谢谢
San*_*rma 25
每个线程都将被赋予一个本机操作系统线程到RUN,它可以在不同的CPU上运行但是由于Java被解释,这些线程将需要一次又一次地与JVM交互以将字节代码转换为机器指令?我对吗 ?
你混合了两件不同的东西; 由VM完成的JIT和VM提供的线程支持.在内心深处,你所做的一切都转化为某种本地代码.使用线程的字节码指令与访问线程的JIT代码没有什么不同.
如果是,那么对于较小的程序,Java Threads不会是一个很大的优势吗?
在这里定义小.对于短期流程,是的,由于顺序执行足够快,因此线程不会产生很大的差异.请注意,这又取决于要解决的问题.对于UI工具包,无论应用程序有多小,都需要某种线程/异步执行来保持UI响应.
当你拥有可以并行运行的东西时,线程也是有意义的.一个典型的例子是在线程上执行大量IO,在另一个线程中执行计算.你真的不想因为你的主线程被阻塞做IO而阻止你的处理.
一旦Hotspot编译这两个执行路径,它们都可以像原生线程一样好吗?我对吗 ?
看到我的第一点.
线程真的不是银弹,特别是当涉及到"使用线程使代码更快"的常见误解时.一点点阅读和经验将是您最好的选择.我可以推荐一本这本很棒的书吗?:-)
@Sanjay:现在我可以重新构思我的问题了.如果我有一个其代码未被JIT的线程,OS线程如何执行它?
我再说一遍,线程与JIT完全不同.让我们试着用简单的术语来看一下程序的执行情况:
java pkg.MyClass - > VM定位要运行的方法 - >开始逐行执行方法的字节码 - >将每个字节码指令转换为其本机对应 - >由OS执行的指令 - >由机器执行的指令
当JIT开始时:
java pkg.MyClass - > VM定位要运行的方法,已经JIT了 - >找到该方法的相关本机代码 - > OS执行的指令 - >机器执行的指令
如您所见,无论您遵循何种路由,VM指令都必须在某个时间点映射到其本地对应方.是否存储该本机代码以供进一步重用或在不同的情况下丢弃(优化,还记得吗?).
因此,为了回答您的问题,每当您编写线程代码时,它都会被转换为本机代码并由操作系统运行.这种翻译是在运行中完成还是在那个时间点查找是一个完全不同的问题.
And*_*s_D 11
并且整个Java进程仅作为单个OS线程运行
这不是真的.因此,我们经常看到,未指定Java线程实际上是本机操作系统线程,而多线程Java应用程序确实使用多核处理器或多处理器平台.
一个常见的建议是使用线程池,其中线程数与核心数成比例(因子1-1.5).这是另一个提示,即JVM不限于单个OS线程/进程.
来自wkipedia:
在Java 1.1中,绿色线程是JVM使用的唯一线程模型,[4]至少在Solaris上.由于绿色线程与本机线程相比具有一些限制,因此后续Java版本将它们放弃以支持本机线程.
现在,早在2010年,Java 7正在开发中,Java 8正在计划中 - 我们是否仍然对历史性的"绿色线程"感兴趣?
| 归档时间: |
|
| 查看次数: |
16381 次 |
| 最近记录: |