一、线程的五种状态

  线程的生命周期可以大致分为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 的六个枚举常量:NEWBLOCKEDRUNNABLEWAITINGTIMED_WAITINGTERMINATED

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中线程的状态深入浅出相关推荐

  1. java中线程的状态以及线程栈分析

    java中线程的状态 状态 说明 NEW 初始状态.线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态.表示线程正在java虚拟机中执行,但是可能正在等待操作系统的其他资源, ...

  2. Java中线程的状态

    Java中线程的状态 操作系统中线程的状态 Java中线程的状态 线程状态枚举类 操作系统中线程的状态 从操作系统层面来看,线程通常有以下五种状态,前三种是线程的基本状态. [运行态]:进程正处在处理 ...

  3. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍

    1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...

  4. 并发基础篇(一) 线程介绍

    一.说在前面 从今天开始,小编准备开始并发篇的长途奔跑了,不知道小伙伴们对于线程掌握的怎么样,不过没关系,小编将带你从基础开始学习,慢慢深入,希望每一篇文章对小伙伴们都有收获,能够做到充实或者巩固线程 ...

  5. java 多线程状态_总结Java中线程的状态及多线程的实现方式

    线程的状态线程状态图: 说明: 线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪 ...

  6. Java中线程的状态。

    线程的状态:一个线程只能有一次NEW状态,和TERMINATED状态         NEW(新建状态):创建后,启动前.线程就处于该状态         RUNNABLE(可运行状态):线程正在执行 ...

  7. java 中线程的状态

    java中线程一共有六种状态: 这个是线程枚举类中的状态       New  :  新建状态 ,我刚创建一个线程,但是还没有执行start()方法,这个阶段就是新建状态. Runnable :  可 ...

  8. java中线程的6种状态

    java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running ...

  9. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch

    上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...

最新文章

  1. sql 根据多个ID删除表中多行数据
  2. C# 3.0新特性之扩展方法
  3. 到底要不要拯救地球?真·逻辑鬼才!| 今日最佳
  4. ajax会占用服务器端内存吗,javascript - 为什么不允许在jquery datatable服务器端处理ajax成功使用? - 堆栈内存溢出...
  5. 怎么让照片变年轻_女生都想要变年轻,但是应该怎么做呐?其实有了背带裤就可以搞定...
  6. [转]SpringMVCfrom:form表单标签和input表单标签简介
  7. 在eclipse中如何搭建ssh框架
  8. ABAP SMARTFORMS 套打
  9. openGL天空盒实现-立方体贴图
  10. 中国地图矫正中的误差
  11. Oracle PL/SQL 循环
  12. ORACLE导出表数据-dmp文件
  13. linux中/etc/hosts文件的含义
  14. Java面试题全集(三)
  15. k8s入门:存储(storage)
  16. golang float转string后去除末尾的0
  17. HDU 2075 JAVA
  18. Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
  19. matlab仿真匹配滤波器,应用于雷达系统匹配滤波器的matlab仿真
  20. 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表 (15 分)...

热门文章

  1. 设计模式研究(二)-Singleton
  2. InterlockedIncrement函数详解
  3. BLE-NRF51822教程10—动态密码(配对码)
  4. 使用 Linux 系统调用的内核命令图解
  5. 练习1: Python基本语法元素 (第1周)
  6. (chap4 IP协议) 路由控制( Routing)
  7. C++(十)——模板(上)
  8. Shell编程之for循环
  9. 剖析boot.img的制作流程
  10. 虚拟键码 键盘消息(初稿)