1.五种状态(操作系统角度)

以下是从操作系统层面来描述的

**[初始状态]**仅是在语言层面创建 了线程对象, 还未与操作系统线程关联.

[可运行状态] (就绪状态)指该线程已经被创建(与操作系统线程关联), 可以由CPU调度执行

[运行状态]
指获取了CPU时间片运行中的状态
当CPU时间片用完,会从[运行状态]转换至[可运行状态],会导致线程的上下文切换
如果调用了阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,会导致线程上下文切换

[阻塞状态]
等BIO操作完毕,会由操作系统唤醒阻塞的线程,转换至[可运行状态]
与[可运行状态]的区别是,对[阻塞状态]的线程来说只要它们一-直不唤醒,调度器就-直不会考虑调度它们

[终止状态]
表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态

2.六种状态(API层面)

这是Java API层面来描述的
根据Thread State枚举,分为六种状态

public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
}

NEW 线程刚被创建,但是还没有调用 start() 方法
RUNNABLE 当调用了 start() 方法之后,注意,Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的【可运行状态】、【运行状态】和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行)
BLOCKED , WAITING , TIMED_WAITING 都是 Java API 层面对【阻塞状态】的细分
BLOCKED:线程拿不到锁,进入阻塞态,如synchronized
WAITING:当不满足条件时,线程需要等待,如wait()方法和join()方法
TIMED_WAITING:需要等待一段时间,如sleep和带时间参数的join()方法
后面会在状态转换一节详述
TERMINATED 当线程代码运行结束

join()函数属于WAITING
sleep()函数属于TIMED_WAITING
关于这两种方法的特性可参看多线程基础

3.线程的6种状态演示

@Slf4j(topic = "c.Test5")
public class TestState {public static void main(String[] args) {//没有调用线程1的start方法,所以属于new这个状态Thread t1=new Thread("t1"){@Overridepublic void run() {log.debug("running...");}};Thread t2=new Thread("t2"){@Overridepublic void run() {while(true){}   //RUNNABLE(可能分了时间片,也可能陷入IO阻塞)}};t2.start();Thread t3=new Thread("t3"){@Overridepublic void run() {log.debug("running...");}};//t3线程start完之后就结束了,所以最终进入了terminatedt3.start();Thread t4=new Thread("t4"){@Overridepublic void run() {synchronized (TestState.class){try {//sleep的时间足够长,主线程查看线程状态可以查看到Time_WaitingThread.sleep(1000000);} catch (InterruptedException e) {e.printStackTrace();}}}};t4.start();Thread t5=new Thread("t5"){@Overridepublic void run() {try{//等待包含死循环的t2运行结束,所以t5会一直等待,没有time的叫Waitingt2.join();} catch (InterruptedException e) {e.printStackTrace();}}};t5.start();Thread t6=new Thread("t6"){@Overridepublic void run() {//由于t4线程已经对TestState.class上锁了,t6拿不到锁,就会陷入到blocked状态synchronized (TestState.class){try {Thread.sleep(10000000);} catch (InterruptedException e) {e.printStackTrace();}}}};t6.start();Log.debug("t1 state {}",t1.getState());Log.debug("t2 state {}",t2.getState());Log.debug("t3 state {}",t3.getState());Log.debug("t4 state {}",t4.getState());Log.debug("t5 state {}",t5.getState());Log.debug("t6 state {}",t6.getState());  }
}

运行结果:

c.TestState[t3]-running
c.TestState[main]-t1 state NEW
c.TestState[main]-t2 state RUNNABLE
c.TestState[main]-t3 state TERMINATED
c.TestState[main]-t4 state TIMED_WAITING
c.TestState[main]-t5 state WAITTING
c.TestState[main]-t6 state BLOCKED

Java并发编程-线程的状态相关推荐

  1. Java 并发编程 -- 线程池源码实战

    一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...

  2. Java并发编程—线程间协作方式wait()、notify()、notifyAll()和Condition

    原文作者:Matrix海 子 原文地址:Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 目录 一.wait().notify()和notifyA ...

  3. Java并发编程——线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  4. java workerdone_【架构】Java并发编程——线程池的使用

    前言 如果我们要使用线程的时候就去创建一个,这样虽然非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为 ...

  5. Java并发编程-线程安全基础

    线程安全基础 1.线程安全问题 2.账户取款案例 3.同步代码块synchronized synchronized的理解 java中有三大变量的线程安全问题 在实例方法上使用synchronized ...

  6. java并发编程——线程池的工作原理与源码解读

    2019独角兽企业重金招聘Python工程师标准>>> 线程池的简单介绍 基于多核CPU的发展,使得多线程开发日趋流行.然而线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以 ...

  7. java并发编程线程安全

    2019独角兽企业重金招聘Python工程师标准>>> 编写线程安全的代码实质就是管理对状态的访问,而且通常是共享的.可变的状态,对象的状态就是数据,存储在状态变量中,比如实例域,或 ...

  8. Java并发编程—线程同步类

    原文作者:洲洋1984 原文地址:Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提 ...

  9. Java并发编程——线程带来的风险

    在并发中有两种方式,一是多进程,二是多线程,但是线程相比进程花销更小且能共享资源. 多线程将会带来几个问题: 一.安全性问题. 线程安全性可能是非常复杂的,多线程中的操作执行顺序是不可预测的,甚至会产 ...

最新文章

  1. with as python_python - with as的用法
  2. python 删除列表中的指定元素
  3. 为什么基本类型可以调用方法——以字符串为例
  4. mysql 给字段添加索引_怎么给mysql表的字段添加索引和查询索引呢
  5. 介绍一下python有趣的库-tqdm
  6. 光流 | 稠密光流估计(基于LK光流)(源代码分享)
  7. 14W 行代码量的前端页面长什么样
  8. paramiko上传下载
  9. 遇到IIS configuration error错误的可以看看,不一定是权限问题
  10. 微信自动抢红包软件被判赔 475 万;日本科学家打破网速全球纪录;JavaScript蝉联最受欢迎编程语言|极客头条...
  11. [Java] 蓝桥杯ALGO-115 算法训练 和为T
  12. ASP.NET数据绑定控件数据项中的服务器控件注册JS方法
  13. 下载SAP标准教程的方法
  14. ua获取手机型号_如何根据 UA 判断手机型号和厂家?
  15. JSP九大内置对象和四大作用域
  16. 2021 年“认证杯”数学中国数学建模网络挑战赛 B题解题思路
  17. 街区最短路径问题——曼哈顿距离
  18. AUTOCAD——弧形文字排列
  19. C语言课程设计——电影院订票系统
  20. vue-element:实现微信表情

热门文章

  1. 程序员做到年薪60万也不去炫富,背后原因曝光,麻烦做个人吧
  2. GDB 远程调试试验(gdbserver)【ZT】
  3. JS事件、对象基础篇
  4. php png缩放,PHP实现对png图像进行缩放的方法(支持透明背景)
  5. mysql设置空值显示null_mysql的空值与NULL的区别
  6. mongodb书籍_我为什么放弃MySQL,选择了MongoDB?看到这个数据你就会明白了
  7. 服务器报告它来自digest_2020年全球服务器市场规模及竞争格局分析
  8. [学习备忘录]Linux平台静态库、动态库的一些笔记
  9. Java程序运行时,没有赋值的基本类型变量会在内存中分配空间吗?
  10. 虚拟机启动后链接超时