java体系中线程的实现

1.使用内核线程实现

内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上,每个内核线程可以视作内核的一个分身,这样操作系统就有能力处理多件事情,支持多线程的内核就叫做多线程内核,程序一般不会其使用内核线程,而是去使用内核线程的一种高级接口:轻量级进程,轻量级进程就是我们通常意义上的线程,由于每个轻量级进程都有一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程(1:1关系),由于内核线程的支持,每个轻量级进程都成为一个独立的调度单元,即使有一个轻量级进程在系统中阻塞了,也不会影响整个进程的工作,但是轻量级进程有局限性:1.由于是基于内核线程实现的,所以线程的各种操作(创建,析构,同步)都需要进行系统调用,而系统调用的代价高,需要在用户态和内核态中来回切换,2.每个轻量级进程都需要一个内核线程的支持,因此轻量级进程要消耗一定的内核资源,因此系统支持的轻量级进程是有数量限制的

2.使用用户线程实现

完全建立在用户空间的线程库上的线程,系统内核不能感知线程的存在,用户线程的建立,同步,销毁和调度完全在用户态中实现,如果程序实现得当,这种线程不需要切换到内核态,操作可以快速和低消耗,可以支持规模更大的线程数量,部分高性能数据库中的多线程就是由用户线程实现的,但是由于不用切换到内核态,所以一些问题得不到内核的帮助,比如阻塞任何处理,多处理器系统中任何将线程映射到其他处理器上,这些问题解决起来异常困难

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

即存在用户线程,又存在轻量级进程,用户线程还是完全建立在用户空间当中,用户线程的创建,切换,析构等操作依然廉价,并可以支持大规模的用户线程并发,而操作系统提供的轻量级进程则作为用户线程和内核之间的桥梁,这样可以使用内核提供的线程调度功能和处理器映射,并且用户线程的1系统调用要通过轻量级进程来完成,大大降低了整个经凑被完全阻塞的风险

java体系中线程的调度

主要有两种调度方式:协同式线程调度,抢占式线程调度

1.协同式线程调度:线程的执行时间由自身控制,线程把工作执行完之后,通知系统切换到另一个线程上,协同式调度最大的好处就是实现简单,而且由于线程要把自己的事情干完才会进行线程切换,切换线程对自己也是可知的,所以不存在线程同步的问题,坏处就是线程执行时间不可控,甚至如果一个线程编写有问题,一直不告诉系统进行线程切换,那么程序就会阻塞

2.抢占式线程调度:每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定,线程执行时间可控,不会有一个线程导致整个进程阻塞问题

“建议给某些线程多分配点时间”就引出了线程优先级的概念,优先级越高的线程越容易被系统选择执行

虽然很多操作系统都有线程的优先级,但是这些优先级不一定可以与java中的线程优先级一一对应!

java体系中线程的状态

java定义了5种线程状态,一个线程在任意一个时间点只能有其中一种状态!

1)新建:创建后尚未启动的线程

2)运行:包括操作系统中的正在运行和就绪两种状态,也就是处于此状态的线程可能正在运行或者等待cpu分配时间

3)等待:

*无限期等待:处于这种状态的线程不会被cpu分配执行时间,他们要等待被其他线程唤醒

*限期等待:处于这种状态的线程也不会被cpu分配执行时间,不过无需等待其他线程唤醒,在一定时间后可以由系统唤醒

4)阻塞:阻塞状态在等待获取一个排他锁

5)结束:已终止线程的线程状态

JAVA体系的线程的实现,线程的调度,状态的转换的更多相关文章

  1. Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解

    Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解 1.Java虚拟机运行时数据区图 2. 堆的默认分配图 3.方法区结构图 4.对象的内存布局图 5.对象头的Ma ...

  2. 死磕 java线程系列之线程池深入解析——未来任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普 ...

  3. Java 线程和操作系统的线程有啥区别?

    尽人事,听天命.博主东南大学硕士在读,携程 Java 后台开发暑期实习生,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收 ...

  4. 额!Java中用户线程和守护线程区别这么大?

    在 Java 语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知,所以本文磊哥带你来看二者之间的区别,以及守护线程需要注意的一些事项. 1.默认用户线程 Java 语言中无论是线程还是 ...

  5. 0039 Java学习笔记-多线程-线程控制、线程组

    join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...

  6. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  7. java多线程系类:JUC线程池:05之线程池原理(四)(转)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  8. java多线程系类:JUC线程池:03之线程池原理(二)(转)

    概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...

  9. java多线程系类:JUC线程池:04之线程池原理(三)(转)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--"基础篇& ...

随机推荐

  1. node 跨域问题

    node跨域有很多方法 1.引入 中间件cors 我觉的最好的方法 var express=require('express'); var cors=require('cors'); var app= ...

  2. 微信 H5 支付流程以及一些坑

    原文:https://blog.niceue.com/front-end-development/wechat-h5-payment-process-as-well-as-some-pits.html ...

  3. ajax小知识

    1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...

  4. CSS--理解块级格式上下文(BFC)

    1.BFC 定义 BFC(Block formatting context)直译为"块级格式化上下文".它是一个独立的渲染区域,只有Block-level box(块级元素)参与, ...

  5. Kotlin入门(7)循环语句的操作

    上一篇文章介绍了简单分支与多路分支的实现,控制语句除了这两种条件分支之外,还有对循环处理的控制,那么本文接下来继续阐述Kotlin如何对循环语句进行操作. Koltin处理循环语句依旧采纳了for和w ...

  6. springcloud 入门 9 (消息总线)

    Spring cloud bus: Spring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核心思想是通 ...

  7. JMeter—逻辑控制器(六)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第一节JMeter逻辑控制器 JMeter逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套 ...

  8. Derek解读Bytom源码-持久化存储LevelDB

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...

  9. Linux源码解析-内核栈与thread_info结构详解

    1.什么是进程的内核栈? 在内核态(比如应用进程执行系统调用)时,进程运行需要自己的堆栈信息(不是原用户空间中的栈),而是使用内核空间中的栈,这个栈就是进程的内核栈 2.进程的内核栈在计算机中是如何描 ...

  10. yum-config-manager命令找不到

    安装: 命令在yum-utils 包里,安装既可以解决:yum -y install yum-utils 当然你也可以通过 dnf 替代 dnf 命令替代: 禁用仓库命令就是: dnf config- ...