当前位置: 首页 > 面试题库 >

Java线程与OS线程

丁灿
2023-03-14
问题内容

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

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

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

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

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

谢谢


问题答案:

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



 类似资料:
  • 问题内容: 如何区分正在运行的Java线程和本机线程? 在Linux中,每个子进程都有一个父进程,他们说0是所有进程的父进程,所有分叉的Java线程中都会有一个父线程吗? 我如何知道哪个Java线程与OS线程相关(如果Java线程派生了本机进程线程)。 Java线程和OS线程有任何命名约定吗? 可以从另一个Java代码中挂起或杀死正在运行的Java线程吗? 问题答案: 在Linux上,Java线程

  • 问题内容: Python中的和模块之间有什么区别? 问题答案: 在Python 3中,已重命名为。它是用于实现的基础结构代码,普通的Python代码不应该靠近它。 公开了底层操作系统级别流程的原始视图。这几乎绝不是您想要的,因此在Py3k中重命名以表明它实际上只是实现细节。 添加了一些额外的自动记帐功能,以及一些便捷实用程序,所有这些使它成为标准Python代码的首选。

  • 问题内容: 今天在一次采访中有人问我这个问题。 “当我们使用(POSIX Threads)创建线程时,该线程将自行启动。为什么我们需要显式调用Java。为什么在创建实例时Java不启动该线程是什么原因。” 我很空白,面试官时间很短,最终他无法向我解释原因。 问题答案: 在Java中,不立即启动线程会导致获得更好的API。您可以在线程上设置属性(守护程序,优先级),而不必在构造函数中设置所有属性。

  • 本文向大家介绍详解Java线程-守护线程与用户线程,包括了详解Java线程-守护线程与用户线程的使用技巧和注意事项,需要的朋友参考一下 干java 开发这么多年, 之前一直没留意java 进程还区分守护进程和用户进程。守护进程这个概念最早还是在linux系统中接触的,直到近期使用java开发心跳检测功能时,使用Timer时才发现原来java也有守护线程的概念。 1. Java 线程 1.1 守护线

  • 问题内容: 我想了解这类线程提供的优势。 在哪些环境中,绿色线程比非绿色线程更好?有人说绿色线程更适合多核处理器。 任何预期的行为问题。 问题答案: 绿色线程是“用户级线程”。它们是由“普通”用户级进程而不是内核调度的。因此,它们可用于在不提供该功能的平台上模拟多线程。 特别是在Java上下文中,绿色线程已成为过去。请参见《JDK 1.1 for Solaris开发人员指南》。(这是关于Solar

  • 问题内容: 我正在阅读SašaJurić撰写的《行动中的长生不老药》,在第一章中说: Erlang进程彼此完全隔离。它们不共享内存,并且一个进程的崩溃不会导致其他进程的崩溃。 Java线程也不是真的吗?我的意思是,当Java线程崩溃时,它也不会崩溃其他线程- 尤其是,如果我们正在查看请求处理线程(请将该线程排除在此讨论之外) 问题答案: 在我之后重复: “这些是不同的范例” 大声说20次左右-这是