并发基础篇(四): java中线程的状态深入浅出
一、线程的五种状态
线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法。但对下面所说的六种状态的理解有所帮助,所以也写出来,作为参考。
1. NEW: 线程的新建状态,是指通过New关键字创建了Thread类(或其子类)的对象。
2. RUNNABLE: 这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNABLE状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。
3. RUNNING: 这时的线程指的是获得CPU的RUNNABLE线程,RUNNING状态是所有线程都希望获得的状态。
4. DEAD: 处于RUNNING状态的线程,在执行完run方法之后,或者异常退出时,就变成了DEAD状态了。
5. BLOCKED: 这种状态指的是处于RUNNING状态的线程,出于某种原因,比如调用了sleep方法、等待用户输入等而让出当前的CPU给其他的线程。
注意: BLOCKED状态,包括三种类型状态:等待(wait)、睡眠(sleep)、阻塞(申请资源:I\O、对象的锁);
二、线程的六种状态
在java中,线程的状态其实是六种,对应着枚举类型 Thread.State 的六个枚举常量:NEW
、BLOCKED
、RUNNABLE
、WAITING
、TIMED_WAITING
、TERMINATED
1. NEW : 新建状态,至今尚未启动的线程的状态。
static void NEW() {Thread t = new Thread ();//也就是可以理解为刚刚创建threadSystem. out.println(t.getState());}
2. BLOCKED: 阻塞状态,受阻塞并且正在等待监视器锁的某一线程的线程状态。
private static void BLOCKED() {final Object lock = new Object();Runnable run = new Runnable() {@Overridepublic void run() {for(int i=0; i<Integer.MAX_VALUE; i++){synchronized (lock) {System. out.println(i);}}}};Thread t1 = new Thread(run);t1.setName( “t1”);Thread t2 = new Thread(run);t2.setName( “t2”);t1.start();t2.start();}
3. RUNNABLE: 可运行线程的线程状态。这里其实合并了两种状态(RUNNING、RUNABLE)
private static void RUNNABLE() {Thread t = new Thread(){public void run(){for(int i=0; i<Integer.MAX_VALUE; i++){System. out.println(i);}}};t.start();}
当线程调用了start()方法之后,就是运行状态了。
4. WAITING : 等待状态,表示线程进入状态。进入此状态后,会无限等待,直到其他线程做出一些特定的动作(唤醒通知、中断通知)才会再次运行。
private static void WAITING() {final Object lock = new Object();Thread t1 = new Thread(){@Overridepublic void run() {int i = 0;while(true ){synchronized (lock) {try {lock.wait();//调用这个方法,进入等待状态} catch (InterruptedException e) {}System. out.println(i++);}}}};Thread t2 = new Thread(){@Overridepublic void run() {while(true ){synchronized (lock) {for(int i = 0; i< 10000000; i++){System. out.println(i);}lock.notifyAll();}}}};t1.setName( “^^t1^^”);t2.setName( “^^t2^^”);t1.start();t2.start();}
5. TIMED_WAITING : 计时等待状态,此状态与 WAITING 状态有些类似,但它是有时间限制的,即只会等待一段指定的时间,当时间到来前,没有被唤醒或或中断,那么时间到来了,就自动”醒来”,进入RUNNABLE状态。
synchronized (lock) {try {lock.wait(60 * 1000L);//只会等待一段指定的时间,当时间到来前,没有被唤醒或或中断} catch (InterruptedException e) {}System. out .println(i++);}
6. TERMINATED : 终止状态,已终止线程的线程状态。
private static void TERMINATED() {Thread t1 = new Thread();t1.start();System. out.println(t1.getState());try {Thread. sleep(1000L);} catch (InterruptedException e) {}System. out.println(t1.getState());}
三、线程的状态转换
- 当一个线程执行了start方法后,不代表这个线程就会立即被执行,只代表这个线程处于可运行的状态,最终由OS的线程调度来决定哪个可运行状态下的线程被执行。
- 一个线程一次被选中执行是有时间限制的,这个时间段叫做CPU的时间片,当时间片用完但线程还没有结束时,这个线程又会变为可运行状态,等待OS的再次调度;在运行的线程里执行Thread.yeild()方法同样可以使当前线程变为可运行状态。
- 在一个运行中的线程等待用户输入、调用Thread.sleep()、调用了其他线程的join()方法,则当前线程变为阻塞状态。
- 阻塞状态的线程用户输入完毕、sleep时间到、join的线程结束,则当前线程由阻塞状态变为可运行状态。
- 运行中的线程调用wait方法,此线程进入等待队列。
- 运行中的线程遇到synchronized同时没有拿到对象的锁标记、等待队列的线程wait时间到、等待队列的线程被notify方法唤醒、有其他线程调用notifyAll方法,则线程变成锁池状态。
- 锁池状态的线程获得对象锁标记,则线程变成可运行状态。
- 运行中的线程run方法执行完毕或main线程结束,则线程运行结束。
文章有不当之处,欢迎指正,你也可以关注我的微信公众号:
好好学java
,获取优质学习资源。
并发基础篇(四): java中线程的状态深入浅出相关推荐
- java中线程的状态以及线程栈分析
java中线程的状态 状态 说明 NEW 初始状态.线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态.表示线程正在java虚拟机中执行,但是可能正在等待操作系统的其他资源, ...
- Java中线程的状态
Java中线程的状态 操作系统中线程的状态 Java中线程的状态 线程状态枚举类 操作系统中线程的状态 从操作系统层面来看,线程通常有以下五种状态,前三种是线程的基本状态. [运行态]:进程正处在处理 ...
- [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...
- 并发基础篇(一) 线程介绍
一.说在前面 从今天开始,小编准备开始并发篇的长途奔跑了,不知道小伙伴们对于线程掌握的怎么样,不过没关系,小编将带你从基础开始学习,慢慢深入,希望每一篇文章对小伙伴们都有收获,能够做到充实或者巩固线程 ...
- java 多线程状态_总结Java中线程的状态及多线程的实现方式
线程的状态线程状态图: 说明: 线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪 ...
- Java中线程的状态。
线程的状态:一个线程只能有一次NEW状态,和TERMINATED状态 NEW(新建状态):创建后,启动前.线程就处于该状态 RUNNABLE(可运行状态):线程正在执行 ...
- java 中线程的状态
java中线程一共有六种状态: 这个是线程枚举类中的状态 New : 新建状态 ,我刚创建一个线程,但是还没有执行start()方法,这个阶段就是新建状态. Runnable : 可 ...
- java中线程的6种状态
java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running ...
- 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch
上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...
最新文章
- sql 根据多个ID删除表中多行数据
- C# 3.0新特性之扩展方法
- 到底要不要拯救地球?真·逻辑鬼才!| 今日最佳
- ajax会占用服务器端内存吗,javascript - 为什么不允许在jquery datatable服务器端处理ajax成功使用? - 堆栈内存溢出...
- 怎么让照片变年轻_女生都想要变年轻,但是应该怎么做呐?其实有了背带裤就可以搞定...
- [转]SpringMVCfrom:form表单标签和input表单标签简介
- 在eclipse中如何搭建ssh框架
- ABAP SMARTFORMS 套打
- openGL天空盒实现-立方体贴图
- 中国地图矫正中的误差
- Oracle PL/SQL 循环
- ORACLE导出表数据-dmp文件
- linux中/etc/hosts文件的含义
- Java面试题全集(三)
- k8s入门:存储(storage)
- golang float转string后去除末尾的0
- HDU 2075 JAVA
- Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
- matlab仿真匹配滤波器,应用于雷达系统匹配滤波器的matlab仿真
- 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表 (15 分)...