多线程历来是面试重灾区,有时对多线程的掌握程度决定了开发者的级别。想掌握多线程还是需要在实际工作中多应用。

而实际上经常用多线程开发的开发者并不多。但面试要问怎么办,只能是面向面试来学习。各个击破,事半功倍。

状态概述

今天我们来聊聊多线程之状态。这些状态是申明在了 java.lang.Thread.State 的枚举里。

for (Thread.State state : Thread.State.values()) {System.out.println(state);
}
打印结果:
NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
TERMINATED
  1. New 初始化状态

  2. Runnable 可执行状态,包含Ready状态和Running状态,当线程start()方法被调用,线程处于可被线程调度器选中执行的状态,就是Ready。待到被执行时就是Running状态。等获得CPU时间片后变为运行中状态Running

  3. Waiting  等待被唤醒

  4. Timed waiting 等待一段时间后自动唤醒

  5. Blocked 线程阻塞,等待锁

  6. Terminated 线程结束

状态如何切换

状态切换图:

  • 简单状态切换 NEW -> RUNNABLE -> TERMINATED

Thread t1 = new Thread(()->{System.out.println("Thread go!");try {Thread.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}});//NEW
System.out.println("执行new后状态 1::" + t1.getState());
t1.start();
//RUNNABLE
System.out.println("执行start后状态 2::" + t1.getState());
//等待线程执行完毕
t1.join();
//TERMINATED
System.out.println("执行join后的状态 3::" + t1.getState());打印结果:
执行new后状态 1::NEW
执行start后状态 2::RUNNABLE
Thread go!
执行join后的状态 3::TERMINATED
  • WAITING & TIMED_WAITING

Thread t2 = new Thread(() -> {LockSupport.park();System.out.println("t2 run begin");try {//睡眠3sTimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}
});t2.start();
//主线程睡眠1s
TimeUnit.SECONDS.sleep(1);
System.out.println("t2 park:" + t2.getState());//WAITING
//唤醒t2
LockSupport.unpark(t2);
//主线程睡眠1s:确认t2被叫醒
TimeUnit.SECONDS.sleep(1);
System.out.println("t2 unpark:" + t2.getState());//TIMED_WAITING1
  • Blocked

  final Object o = new Object();Thread t3 = new Thread(() -> {synchronized (o) {System.out.println("t3 start!");}});Thread t4 = new Thread(() -> {synchronized (o) {try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t4 start");}});//t4 start拿到锁t4.start();//主线程睡一秒,保证t4已经拿到锁Thread.sleep(1);//t3 start竞争锁t3.start();Thread.sleep(1);System.out.println("t3状态:" + t3.getState());//Blocked

总结

这个小知识点比较简单,就不多做解释。积沙成塔,祝福面试成功。

学习就是今天比昨天进步一点点,加油Coder!

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

面试:Java线程有哪几种状态,它们之间是如何切换的相关推荐

  1. Java线程到底有几种状态

    前言 很多文章说Java线程有五种状态:NEW(新建).RUNNABLE(就绪).RUNNING(运行).BLOCKED(阻塞).DEAD(死亡),而阻塞又分为等待阻塞.同步阻塞.其它阻塞. 很遗憾这 ...

  2. Java线程 Thread 的6种状态以及转变过程

    线程的6种状态以及转变: java的线程一共6种状态.具体代码见: java.lang.Thread.State 1 NEW 新建状态 Thread state for a thread which ...

  3. Java并发编程一线程池的五种状态

    推荐:Java并发编程汇总 Java并发编程一线程池的五种状态 原文地址 Java多线程线程池(4)–线程池的五种状态 正文 线程池的5种状态:Running.ShutDown.Stop.Tidyin ...

  4. Java线程池--线程池的五种状态

    线程池的5种状态:Running.ShutDown.Stop.Tidying.Terminated. 线程池各个状态切换框架图: 1.RUNNING (1) 状态说明:线程池处在RUNNING状态时, ...

  5. 线程池的五种状态及创建线程池的几种方式

    上篇<Java线程的6种状态详解及创建线程的4种方式> 前言:我们都知道,线程是稀有资源,系统频繁创建会很大程度上影响服务器的使用效率,如果不加以限制,很容易就会把服务器资源耗尽.所以,我 ...

  6. Java中对象的三种状态

    转载自   Java中对象的三种状态 Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可 ...

  7. 线程及线程池的五种状态

    线程的5种状态 线程可以有如下5种状态:New .Runnable .Running .Blocked .Dead 状态之间的转换如图: 1.New (新创建) 当用new操作符创建一个线程时,如ne ...

  8. Java线程同步的几种方式

    Java线程同步的几种方式 1.使用synchronized关键字  它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性.  synchronized关键字的用法: ...

  9. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

最新文章

  1. 维基链超级节点竞选的具体细节有哪些?
  2. Spring Cloud之Hystrix
  3. php获取另一个php页面_post值,php接受post传值的方法
  4. python综合程序设计-Python程序设计实验五:综合运用三种基本结构进行程序设计...
  5. Java Cardioid 心脏形曲线 (整理)
  6. Py之lightgbm:lightgbm的简介、安装、使用方法之详细攻略
  7. Spring教程--入门程序
  8. 评审会上产品经理常被怼的话
  9. Solr(二)创建索引和查询索引的基本应用
  10. 浅析C++开发语言的特点
  11. mongodb 集合操作 (增删改查)
  12. httpd在嵌入式中应用
  13. freeswitch的dialplan中condition变量
  14. Xcode6无法安装VVDocumenter插件的解决方法
  15. 三菱plc控制步进电机实例_电工想做PLC工程师?那步进电机的编程控制指令你一定要了解...
  16. 网卡的功能主要有两个
  17. 第一方数据,第二方数据,第三方数据:你了解多少?
  18. C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形
  19. 什么是make/Makefile?
  20. python 概率分布模型_使用python的概率模型进行公司估值

热门文章

  1. linux看dns解析的时间,curl测试dns解析时间
  2. php网站不能访问,php怎么不登录不能访问
  3. css里slidebottom,jquery - 从CSS“top”到“bottom”的jQuery动画 - 堆栈内存溢出
  4. ajax不能访问本地php文件,php – 使用htaccess拒绝ajax文件访问
  5. jenkins -ant-svn 自动化持续部署——web应用war包 ant build.xml配置
  6. 什么是压栈操作?指令:PUSH src ;src为16位操作数
  7. 3-3:常见任务和主要工具之网络
  8. 100万并发连接服务器笔记之1M并发连接目标达成
  9. Dedecms 最新版漏洞收集并复现学习
  10. C/C++vsnprintf用法(要配合va_list使用)