Java并发编程的艺术(五)——线程和线程的状态
线程
什么是线程
操作系统调度的最小单元就是线程,也叫轻量级进程。
为什么要使用多线程
- 多线程程序能够更有效率地利用多处理器核心。
 - 用户响应时间更快。
 - 方便程序员将程序模型映射到Java提供的多线程编程模型上。
 
线程的状态
1. 初始态 NEW
线程被构建,但是还没有调用start()方法调用。
2 运行态 RUNNABLE
运行态又分为就绪态和运行态:
- 就绪态:该状态下线程已经具备执行所需要的所有资源,只等CPU分配执行权就能运行。所有的就绪态线程都排在就绪队列中。
 - 运行态:获取CPU执行权的正在执行的线程。每个CPU同时只有一条运行态的线程。
 
3.阻塞态
表示线程阻塞于锁。
- 当线程请求一个资源失败的时候,就会进入阻塞态。Java中阻塞态就是指线程获取锁失败后进入的状态。是被动进入的。
 - 所有阻塞态的线程被排在阻塞队列当中。
 - 处于阻塞态的线程会不断请求资源,当请求成功的时候,就会又进入就绪队列等待执行。
 
4.等待态
- 当前线程中调用wait join park时,线程就会进入等待态。
 - 等待态的线程放在等待队列中。
 - 需要又其他线程的唤醒才行。
 - 会释放资源。
 
5.超时等待态
- 当线程中调用sleep wait join parkNanos parkUntil时,就是让线程进入等待态。
 - 与等待态不同,不是因为请求不到资源,这是主动进入的,需要其他线程对其进行唤醒。
 - 等待态的线程没有CPU执行权和占有资源。
 - 到了超时时间后进入阻塞队列,开始竞争锁。
 
6.终止态
线程执行结束后的状态。
线程状态转换

- 初始态 ——> 就绪态
当调用线程对象的start()方法就会进入就绪态。当就绪态队列中没有线程,那就直接进入运行态。 - 就绪态 ——> 运行态
由系统调度。 - 运行态 ——> 就绪态
调用Thread.yield()函数 或者 系统调度完成。 - 运行态 ——> 阻塞态
线程获取锁失败。 - 阻塞态 ——> 就绪态
获取到锁。 - 运行态 ——> 等待态
调用Object.wait() 方法,其调用必须是在同步块内部由同步块的锁对象调用。
调用Thread.join() LockSupport.part() 方法。 - 等待态 ——> 就绪态
锁对象被调用了Object.notify() 方法,并且等待的线程不需要锁。
还有Object.notifyAll() LockSupport.unpark(Tread) 方法。 - 等待态 ——> 阻塞态
锁对象 notify的时候,被等地啊线程还需要锁同步。 
知识点
- wait方法会释放CPU的执行权和占有的锁。
 - sleep方法会释放CPU的使用权,但是任然占有锁;线程被放入超时等待队列,它会使线程较长时间得不到运行。
 - wait和notify必须配套使用,必须使用同一把锁。
 - wait和notify必须放在一个同步块中。
 - notify和notifyAll的区别在于,前者只唤醒等待队列中的一个线程,而后者是所有线程。
 
Daemon 线程
作用
是一种支持型线程,主要用作程序中后台调度和支持性共工作。
如果一个Java虚拟机中不存在非Deamon线程的时候,Java虚拟机就会退出,因为不会再有任务了呀。
Java线程使用
Java并发编程的艺术(五)——线程和线程的状态的更多相关文章
- Java并发编程的艺术(五)——中断
		
什么是中断? 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作.因此,Java提供了一种用于停止线程的机制——中断. 中断只是一种协作机制,Java没有给中断增加任 ...
 - Java并发编程的艺术(七)——线程间的通信
		
为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...
 - Java并发编程的艺术(十一)——Executor与线程池
		
Executor框架简介 从JDK5开始,把工作单元和执行机制分离开来了,工作的单元包括Runnable和Callable,执行机制就是由Executor框架提供. Executor两级调度模型 Ho ...
 - Java并发编程的艺术(六)——线程间的通信
		
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...
 - java并发编程笔记(五)——线程安全策略
		
java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...
 - 读《Java并发编程的艺术》(一)
		
离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...
 - Java并发编程的艺术读书笔记(2)-并发编程模型
		
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
 - Java并发编程的艺术读书笔记(1)-并发编程的挑战
		
title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...
 - 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
		
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
 - Java并发编程的艺术(三)——volatile
		
1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...
 
随机推荐
- 双数组字典树(Double Array Trie)
			
参考文献 1.双数组字典树(DATrie)详解及实现 2.小白详解Trie树 3.论文<基于双数组Trie树算法的字典改进和实现> DAT的基本内容介绍这里就不展开说了,从Trie过来的同 ...
 - Ubuntu 12.10设置root用户登录图形界面
			
Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...
 - elasticsearch快速安装启动
			
准备 docker docker内安装centos容器,模拟服务器环境 centos容器安装 下载centos容器 docker pull centos 启动docker容器 docker run - ...
 - MathType中怎么编辑韩文字符
			
用MathType编辑公式,所涉及到符号与字母一般都是英文字母与数字,或者使用希腊字母,当然还有很多使用中文的情况.但是不仅如此,我们在使用MathType时,除了这些字符之外,还可以输入韩文或者日文 ...
 - 思维导图软件iMindMap:生活工作的好帮手
			
思维导图iMindMap这样的好帮手在生活工作中能帮你打破困境,,至于它有哪些力所能及的事情就是下面小编要跟你讲的: 你是否经常遇到过这样的情况: 作为学生,你觉得学习紧张,虽然三更眠五更起,还是成绩 ...
 - docker提示容器已存在
			
docker ps -a docker rm 容器id 重启启动
 - Java蓝桥杯——递归练习题:走台阶(偶数版)
			
递归练习题:走台阶(偶数版) 小明刚刚看完电影<第39级台阶>.离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个 ...
 - sentinel快速入门
			
转载:https://blog.csdn.net/noaman_wgs/article/details/103328793 https://github.com/alibaba/Sentinel/wi ...
 - Android面试题《思考与解答》11月刊
			
又来更新啦,Android面试题<思考与解答>11月刊奉上. 说说View/ViewGroup的绘制流程 View的绘制流程是从ViewRoot的performTraversals开始的, ...
 - 等待多线程完成的CountDownLatch(带示例)
			
开始磨刀霍霍向多线程了,这期是 CountDownLatch 的一个小示例. 定义:CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用需求举例:假设有4个线程,A.B.C.D ...