当前位置: 首页 > news >正文

java八股文面试[多线程]——线程的状态

5种状态一般是针对传统的线程状态来说(操作系统层面)

image.png

6种状态:Java中给线程准备的

image.png

NEW:Thread对象被创建出来了,但是还没有执行start方法。

RUNNABLE:Thread对象调用了start方法,就为RUNNABLE状态(CPU调度/没有调度)

BLOCKED、WAITING、TIME_WAITING:都可以理解为是阻塞、等待状态,因为处在这三种状态下,CPU不会调度当前线程

BLOCKED:synchronized没有拿到同步锁,被阻塞的情况

WAITING:调用wait方法就会处于WAITING状态,需要被手动唤醒

TIME_WAITING:调用sleep方法或者join方法,会被自动唤醒,无需手动唤醒

TERMINATED:run方法执行完毕,线程生命周期到头了

在Java代码中验证一下效果

NEW:

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {});System.out.println(t1.getState());
}

RUNNABLE:

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {while(true){}});t1.start();Thread.sleep(500);System.out.println(t1.getState());
}

BLOCKED:

public static void main(String[] args) throws InterruptedException {Object obj = new Object();Thread t1 = new Thread(() -> {// t1线程拿不到锁资源,导致变为BLOCKED状态synchronized (obj){}});// main线程拿到obj的锁资源synchronized (obj) {t1.start();Thread.sleep(500);System.out.println(t1.getState());}
}

WAITING:

public static void main(String[] args) throws InterruptedException {Object obj = new Object();Thread t1 = new Thread(() -> {synchronized (obj){try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();Thread.sleep(500);System.out.println(t1.getState());
}

TIMED_WAITING:

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});t1.start();Thread.sleep(500);System.out.println(t1.getState());
}

TERMINATED:

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}});t1.start();Thread.sleep(1000);System.out.println(t1.getState());
}

知识来源:

【2023年面试】Java面向对象有哪些特征_哔哩哔哩_bilibili

http://www.lryc.cn/news/154641.html

相关文章:

  • Go学习[合集]
  • 代码随想录算法训练营第42天 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集
  • 解决DNS服务器未响应错误的方法
  • SpringBoot的HandlerInterceptor拦截器使用方法
  • java 常用 jar 包
  • C#面试十问
  • Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树
  • 四轴飞行器的电池研究(MatlabSimulink仿真)
  • 准备HarmonyOS开发环境
  • Java 面试 - Redis
  • 【Go 基础篇】Go语言结构体之间的转换与映射
  • Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
  • 将 ordinals 与 比特币智能合约集成 : 第 1 部分
  • 【USRP】集成化仪器系列1 :信号源,基于labview实现
  • 串行协议——USB驱动[基础]
  • 健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评
  • PID 算法
  • 13.Redis 事务
  • 李宏毅机器学习课程笔记(更新ing)
  • SIP mini 对讲终端,带sip热点功能
  • PHP中根据出生年月日计算年龄的封装函数
  • Linux巡检脚本
  • SQLite 3.43.0 发布,又有啥新功能?
  • 百度自研高性能ANN检索引擎,开源了
  • golang遍历map的方法
  • 如何让Android平台像网络摄像机一样实现GB28181前端设备接入?
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁 | 京东云技术团队
  • SpringMVC入门篇
  • 面经:安卓学习笔记
  • Java设计模式:四、行为型模式-06:观察者模式