一、线程的实现

  在谈谈线程之前,我们要先知道线程是何物?在学习操作系统时,我们得知进程和线程的概念,接下来我们将开始揭示线程。

什么是进程?通过任务管理器我们就看到了进程的存在。而通过观察,我们发现只有运行的程序才会出现进程。

进程:就是正在运行的程序。
     进程是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。

 什么是线程呢?在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。

线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。
     单线程:如果程序只有一条执行路径。
     多线程:如果程序有多条执行路径。

实现线程主要有三种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。

1、使用内核线程实现

内核线程(Kernel-Level Thread, KLT)就是直接由操作系统内核支持的线程,由内核来完成线程切换,内核通过操作调度器(Scheduler)调度线程,并将线程的任务映射到各个处理器上。

每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事,支持多线程的内核叫做多线程内核。

2、使用用户线程实现

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

用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核线程的帮助。

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

将用户线程和内核线程一起使用的实现方式。

二、 Java的线程实现

操作系统支持怎样的线程模型,在很大程度上就决定了Java虚拟机的线程是怎样映射的。上述的3种线程模型,只对线程的并发规模和操作成本有影响,对Java程序的编码和运行过程来说,这些差异是透明的。

三、线程的调度

线程调度是系统为线程分配处理器使用权的过程。

主要有两种线程调度:

协同式线程调度 (Cooperative Threads-Scheduling)

实现简单,没有线程同步的问题。但是线程执行时间不可控,容易系统崩溃。

抢占式线程调度 (Preemptive Threads-Scheduling)

每个线程由系统来分配执行时间,不会有线程导致整个进程阻塞的问题。

三、java线程状态转换

如上图Java线程状态转换图所示。线程一共有以下几种状态:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

最新文章

  1. 动态创建 Lambda 表达式
  2. dynamic与匿名对象
  3. 3. Builder(建造者)
  4. 关闭 selinux 和防火墙
  5. cf B. Hungry Sequence
  6. CCCardinalSplineBy概念
  7. APUE学习--网络编程(3)
  8. [整理]k-vim-for-server通过vimrc修改vim格式
  9. Alpha第十天
  10. Flutter获取屏幕宽高和Widget大小
  11. python修炼第六天
  12. saver.restore()遇到的错误
  13. ECharts设置y轴显示
  14. python 2.0 与 python 3.0 区别
  15. [IDEA_6] IDEA 集成 Python
  16. 如何在 vCenter Server 上将虚拟机注册或添加到清单中
  17. spring boot JPA中实体类常用注解
  18. 最重要的7个Drupal内核模板文件
  19. jsp页面编写锚点,和html页面编写锚点
  20. 关于EF Unit of Work Repository的简单用法

热门文章

  1. 基于类(Java)和基于原理(JavaScript)的对象系统的比较
  2. (转)Java 读写Properties配置文件
  3. Coursera 机器学习笔记(八)
  4. JavaScript数组去重方法及测试结果
  5. linux shell编程-bash的奇技淫巧
  6. 安装python2.7
  7. 流畅的python学习笔记:第二章
  8. 用queue函数写广搜
  9. python 标准库 -- subprocess
  10. Django 模型和数据库 总结