Java线程状态
线程跟人类一样拥有自己的生命周期,一条线程从创建到执行完毕的过程即是线程的生命周期,此过程可能在不同时刻处于不同的状态,线程状态正是这小节的主题,线程到底有多少种状态?不同状态之间是如何转化的?
对于线程的状态的分类并没有严格的规定,只要能正确表示状态即可,如图2-5-7-1,先看其中一种状态分类,一个线程从创建到死亡可能会经历若干个状态,但在任意一个时间点线程只能处于其中一种状态,总共包含五个状态:新建(new)、可运行(runnable)、运行(running)、非可运行(not runnable)、死亡(dead)。线程的状态的转化可以由程序控制,通过某些API可以达到转化效果,例如Thread类的start、stop、sleep、suspend、resume、wait、notify等方法(stop、suspend、resume等方法因为容易引起死锁问题而早已被弃用)。
图2-5-7-1
l 新建(new):一个线程被创建了但未被启动就处于新建状态,即在程序中使用new MyThread();创建的线程实例就处于此状态。
l 可运行(runnable):创建的线程实例调用start()方法后便进入可运行状态,处于此状态的线程并不是说一定处于运行状态,我们在上一节多线程调度策略了解到Java多线程使用的是抢占式调度,每个可运行线程轮着获取CPU时间片,可以虚拟想象成有一个可运行线程池,start()方法把线程放进可运行线程池中,CPU按一定规则一个个执行池里的线程。
l 运行(running):当可运行线程获取到CPU执行时间片即进去了运行状态。
l 非可运行(notrunnable):运行中的线程因某种原因暂时放弃CPU的使用权,可能是因为执行了挂起、睡眠或等待等操作,在执行I/O操作时由于外部设备速度远低于处理器速度也可能导致线程暂时放弃CPU使用权,在获取对象的同步锁过程中如果同步锁先被别的线程占用同样可能导致线程暂时放弃CPU。
l 死亡(dead):线程执行完run()方法实现的任务,或因为异常导致退出任务,线程进入死亡状态后将不可再转换成其他状态。
将非可运行(not runnable)状态继续细分,如图2-5-7-2,新建、可运行、运行、死亡四个状态的定义和转化与前面的一样,重点看非可运行状态引申出来的三个状态:阻塞(blocked)、同步锁(locked)、等待(waiting)。
l 阻塞(blocked):阻塞由阻塞事件触发,线程处于阻塞状态将放弃CPU的使用权,暂时停止运行。一般线程执行了sleep()、join()方法,或发出了I/O请求,线程就将处于阻塞状态,假如sleep()执行的睡眠结束、join()执行的等待中断超时、I/O请求结束,则将重新回到可执行状态,等待分配CPU。
l 同步锁(locked):假如一个线程准备调用一个同步方法,而同步方法对应的对象正被其他线程占用,此时线程就将进入同步锁状态。实际上,Java中的每个object对象都有一个monitor,此monitor负责对同步域在并发时的独占处理,即一个线程调用某对象的同步方法时,JVM将检测改对象的monitor是否已被占用,如果没有被占用,线程则得到monitor占有权,继续执行该对象的同步方法,否则线程将被扔进一个等待线程队列排队,直到monitor被释放后,所有等待的线程继续竞争monitor占有权,抢到monitor占有权后才进入可执行状态等待CPU的分配,才有资格执行同步方法。
l 等待(waiting):运行中的线程执行了wait()方法后就进入等待状态。一个对象执行了wait()方法同样将使线程进入该对象的等待线程队列,同时它还将释放对象锁,即放弃monitor的占有权。只有在其他线程中对该对象调用notify()、notifyAll()方法时才会唤醒等待线程队列中的线程,notify是随机唤醒等待队列中的一个线程,而nofityAll则是唤醒所有等待队列中的线程,所有线程被唤醒后将对该对象的monitor占有权竞争,获取到占有权的线程才能转化为可执行状态,等待分配CPU往下执行,其他线程则继续等待。
图2-5-7-2
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
Java线程状态的更多相关文章
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...
- Java线程状态转换
前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...
- Java线程状态及 wait、sleep、join、interrupt、yield等的区别
Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断.被拥有该对象锁的线程唤醒(notify或not ...
- Java线程状态切换以及核心方法
1.Java线程状态 1.1 线程主要状态 ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法.②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(runnin ...
- 从源码看java线程状态
关于java线程状态,网上查资料很混乱,有的说5种状态,有的说6种状态,初学者搞不清楚这个线程状态到底是怎么样的,今天我讲一下如何看源码去解决这个疑惑. 直接上代码: public class Thr ...
- 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
- Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...
- JVM探秘:jstack查看Java线程状态
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. jstack命令可以打印Java进程的各个线程堆栈跟踪信息,可以用来查看Java中各个 ...
- 浅谈 Java线程状态转换及控制
线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...
- Java线程状态及切换
Java线程状态及切换 一.什么是Java线程状态 在Java程序中,用于描述Java线程的六种状态: 新建(NEW):当前线程,刚刚新建出来,尚未启动. 运行(RUNNABLE):当前线程,处于竞争 ...
随机推荐
- ios、移动端 input type=date无法点击的问题解决方法
正常用input type = "text",获取焦点的时候,将type 改成 date即可. <div class="form-item"> &l ...
- hdu 5439(找规律)
The sequence is generated by the following scheme. 1. First, write down 1, 2 on a paper. 2. The 2nd ...
- hdu 5137(2014广州—最短路)
题意:给你一个图,求删除一个点后使1->n的距离最大 思路: 枚举删除点,然后求最短路,取这些最短路的最大值 #include <iostream> #include <cst ...
- NOIWC颓废记
NOIWC大概就干了3件事情:吃.睡.浪. 吃: 目测绍兴一中的饭比二中的好吃多了,每天都有挺多的肉菜,还有一些甜品,而且是自助,不错的,但是一个不好的是排队时间太长了,于是我这么珍惜时间急着回宿舍的 ...
- Python-闭包详解
在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...
- 备忘:MySQL中修改表中某列的数据类型、删除外键约束
-- MySQL中修改表中某列的数据类型 ALTER TABLE [COLUMN] 表名 MODIFY 列名 列定义; -- 删除外键约束 SHOW CREATE TABLE 表名; -- 复制CON ...
- easyui datagrid 横向滚动条
要出现横向滚动条则不能有fitColumns:true/false
- font-spider利器对webfont网页字体压缩使用
http://font-spider.org/ npm install font-spider -g hyheilizhitij(汉仪黑荔枝体简) //引入 @font-face{ font-fami ...
- android 欢迎界面的制作
再打开手机app的时候,最先映入我们眼帘的是一个覆盖手机全屏的欢迎界面,在这个界面显示出来的时候整个手机屏幕只会显示这一个界面,上面的标题栏,以及手机最顶端的状态栏都会消失,只有欢迎页面结束跳转到其他 ...
- 一个蒟蒻对FFT的理解(蒟蒻也能看懂的FFT)
建议同学们先自学一下"复数(虚数)"的性质.运算等知识,不然看这篇文章有很大概率看不懂. 前言 作为一个典型的蒟蒻,别人的博客都看不懂,只好自己写一篇了. 膜拜机房大佬 HY 一. ...