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

jvm是如何实现线程的?

姜钊
2023-03-14
本文向大家介绍jvm是如何实现线程的?相关面试题,主要包含被问及jvm是如何实现线程的?时的应答技巧和注意事项,需要的朋友参考一下

考察点:JVM

线程是比进程更轻量级的调度执行单位。线程可以把一个进程的资源分配和执行调度分开。一个进程里可以启动多条线程,各个线程可共享该进程的资源(内存地址,文件IO等),又可以独立调度。线程是CPU调度的基本单位。

主流OS都提供线程实现。Java语言提供对线程操作的同一API,每个已经执行start(),且还未结束的java.lang.Thread类的实例,代表了一个线程。

Thread类的关键方法,都声明为Native。这意味着这个方法无法或没有使用平台无关的手段来实现,也可能是为了执行效率。

实现线程的方式

A.使用内核线程实现内核线程(Kernel-Level Thread, KLT)就是直接由操作系统内核支持的线程。

内核来完成线程切换

内核通过调度器Scheduler调度线程,并将线程的任务映射到各个CPU上

程序使用内核线程的高级接口,轻量级进程(Light Weight Process,LWP)

用户态和内核态切换消耗内核资源

使用用户线程实现

系统内核不能感知线程存在的实现

用户线程的建立、同步、销毁和调度完全在用户态中完成

所有线程操作需要用户程序自己处理,复杂度高

用户线程加轻量级进程混合实现

轻量级进程作为用户线程和内核线程之间的桥梁

 类似资料:
  • 问题内容: 快速编写了一个Java proggy,以每个优先级生成10个线程,并使用BigDecimals分别计算500,000次pi(4 * atan(1)方法),在每个线程上加入并报告运行方法的经过时间。是的,可能不是最好的例子,但要保持基础。 我知道Bug4813310 用C语言完成这项工作并非易事,但是我们可以假设本机优先级从未在Linux JVM上设置吗? 看起来似乎并没有太大的偏差!那

  • 创建一个阻塞队列来容纳任务,在第一次执行任务时创建足够多的线程,并处理任务,之后每个工作线程自动从任务队列中获取线程,直到任务队列中任务为0为止,此时线程处于等待状态,一旦有工作任务加入任务队列中,即刻唤醒工作线程进行处理,实现线程的可复用性。 线程池一般包括四个基本组成部分: (1)线程池管理器 用于创建线程池,销毁线程池,添加新任务。 (2)工作线程 线程池中线程,可循环执行任务,在没有任务时

  • 问题内容: 最近,我对Java中的这种功能感兴趣,因为它具有可变数量的参数。这是一个非常酷的功能。但是我很感兴趣: 如何在运行时级别上实际实现呢?我想到的是,当我们打来电话时: 最后两个参数在内部转换为数组,然后传递给方法。我对此是否正确,或者JVM实际上将堆栈引用插入了字符串,而不仅仅是对数组的引用? 问题答案: 它在编译时级别实现。您的方法被编译为字节码为 相当于 与标志。 和 编译为

  • 问题内容: 我正在以下Java版本上运行单线程Java应用程序: 启用该选项。仍然在启动应用程序时,使用监视系统时看到多个线程正在启​​动。我想尽可能减少启动的进程数,因为我有一个用例,其中涉及运行该应用程序的多个实例,这将达到我正在运行的系统上允许的最大进程数的顶峰。上。除了可以用来减少启动线程数之外,是否还有其他jvm选项? 问题答案: 除了禁用并行或并发GC外,还有以下选项可减少JVM线程数

  • 本文向大家介绍C# 中如何实现线程同步?相关面试题,主要包含被问及C# 中如何实现线程同步?时的应答技巧和注意事项,需要的朋友参考一下 (1)方法一:阻塞(调用Sleep()或Join()) (2)方法二:加互斥锁lock (3)方法三:信号和句柄(AutoResetEvent/ManualResetEvent,调用Set()和WaitOne())    

  • 我一直在阅读有关多线程的Head First。我对多线程的了解是: 当我们使用Thread类的对象调用start()时,线程将进入可运行状态。因此,所有线程在通过这些线程的对象调用start()后都会进入可运行状态。它是JVM线程调度器,它从可运行状态随机选择线程,使其处于运行状态。进入运行状态后,该特定线程的已确定调用堆栈将被执行。 同样,JVM线程调度器可以通过将线程从运行状态切换到可运行状态