您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java 线程在虚拟机中的实现

时间:2019-10-22 13:44:42  来源:  作者:

前言

线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。JAVA语言中每个已经执行了 start() 且还未结束的 java.lang.Thread 类的实例就代表了一个线程。Thread 类的所有关键方法都是声明为Native的,在Java API中,一个Native方法往往意味着这个方法没有使用或者无法使用平台无关的手段来实现(也可能为了执行效率)。

1. 线程的实现

实现线程主要有3种方法:内核线程、用户线程、用户线程加轻量级进程混合实现。

1.1 使用内核线程实现

内核线程(Kernel-Level Thread, KLT)就是由操作系统内核支持的线程,内核通过操作调度器(Scheduler)对线程进行调度。

程序一般不会直接使用内核线程,而是去使用内核线程的一种高级接口-轻量级进程(Light Weight Process, LWP),轻量级进程就是我们通常意义上所讲的线程。

这种轻量级进程内核线程之间1:1的关系称为一对一的线程模型,如下图。

 

Java 线程在虚拟机中的实现

 

 

优点: 每个轻量级进程都成为一个独立的调度单元,即使有一个轻量级进程在系统中阻塞了,也不会影响整个进程继续工作。缺点: 由于是基于内核线程实现的,所以各种线程操作,如创建、析构及同步,都需要进行系统调用,需要在用户态和内核态中来回切换,代价相对较高。

1.2 使用用户线程实现

用户线程(User Thread, UT)指的是完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。

用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。因此操作比内核线程更快速,并可以支持更大的线程数量。

这种进程(不是轻量级进程)与用户线程之间1:N的关系称为一对多的线程模型

 

Java 线程在虚拟机中的实现

 

 

优点: 线程所有操作都在用户态完成,不需要切换到内核态,如果实现得当,那么速度非常快,资源消耗也很低,可以支持更大规模的线程数量。

缺点: 由于线程的操作没有操作系统内核的支援,所有线程操作都需要用户程序自己实现,创建、线程间的切换、调度都需要用户程序处理,并且由于操作系统只把处理器资源分配到了进程,除了线程切换获取处理器外,线程阻塞如何处理,或者把进程内的线程映射到其他处理器,都是非常困难的。

现在使用用户线程的程序越来越少了,像Java、Ruby等语言都曾经使用过用户线程,不过现在都放弃了。

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

在这种混合实现下,既存在用户线程,也存在轻量级进程

用户线程还是完全建立在用户空间中,因此用户线程的创建、切换、析构等操作依然廉价。而操作系统提供轻量级进程则作为用户线程内核线程之间的桥梁。这样可以使用内核提供的线程调度功能及处理器映射,用户线程调用通过轻量级线程来完成。

用户线程轻量级进程的数量比是不定的,即为N:M的关系,这种就是多对多的线程模型

 

Java 线程在虚拟机中的实现

 

 

2. Java 线程的实现

Java 线程在JDK 1.2之前,是基于用户线程实现的,JDK 1.2中替换为基于操作系统原生线程模型来实现。目前的JDK版本中,操作系统支持怎样的线程模型,很大程序上决定了Java虚拟机的线程是怎样映射的。

虚拟机规范中并未限定Java线程需要使用哪种线程模型来实现。

对于Sun JDK来说,它的windows版与linux版都是使用一对一的线程模型实现的,一条Java线程映射到一条轻量级进程中,即内核线程的实现方式。

3. Java 线程的调度

线程调度是指系统为线程分配处理器使用权的过程。主要有协同式线程调度抢占式线程调度两种。

如果使用协同式调度的多线程系统,线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上。如果一个线程写得有问题,一直不告知系统进行线程切换,那么程序就会一直阻塞在那里。

如果使用抢占式调度的多线程系统,那么每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。

Java 使用的线程调度方法就是抢占式调度



Tags:Java 线程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在多线程和高并发场景中,需要创建大量的线程来进行业务处理,我们通常创建线程有两种方法,一种是通过继承Thread类,另一种是实现Runnable的接口,但是我们创建这两种线程在运行结束后都会被虚拟机销毁,如果数量多的话,频繁的创...【详细内容】
2020-05-07  Tags: Java 线程  点击:(43)  评论:(0)  加入收藏
前言线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的...【详细内容】
2019-10-22  Tags: Java 线程  点击:(81)  评论:(0)  加入收藏
下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。...【详细内容】
2019-09-10  Tags: Java 线程  点击:(115)  评论:(0)  加入收藏
前言谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurrent 包下的这个 api,大大的简化了多线程代码的开发。而不论你用 FixedThread...【详细内容】
2019-08-29  Tags: Java 线程  点击:(187)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条