1.背景

编写多线程相关的程序,必然会用到线程状态的相关知识点,

那么这篇博客就给大家系统的分析一下多线程的状态,

由于java中线程状态与操作系统中的线程状态划分有区别,

因此这里优先介绍操作系统的5种线程状态

2.操作系统给线程划分的5种状态

状态说明:

状态一:【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联

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

状态三:【运行状态】指获取了 CPU 时间片运行中的状态当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换,因此并不是线程越多越好.

状态四:【阻塞状态】如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入【阻塞状态】等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们

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

3.java中给线程划分的6中状态

java中规定线程有6中状态

源码: 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 层面对【阻塞状态】的细分,请看下面的状态案例演示。
TERMINATED:当线程代码运行结束

4.代码演示java中的5种状态

package com.ldp.demo01;

import com.common.MyThreadUtil;
import lombok.extern.slf4j.Slf4j; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 01/16 6:38
* @description
*/
@Slf4j
public class ThreadStateTest {
/**
* java 中线程的6中状态演示
*
* @param args
*/
public static void main(String[] args) {
// 演示 NEW 状态
Thread thread1 = new Thread(() -> {
}, "thread1"); // 演示 RUNNABLE 状态
Thread thread2 = new Thread(() -> {
while (true) {
}
}, "thread2");
thread2.start(); // 演示 TERMINATED 状态
Thread thread3 = new Thread(() -> {
log.debug("running........");
}, "thread3");
thread3.start(); // 演示 TIMED_WAITING 状态
Thread thread4 = new Thread(() -> {
synchronized (ThreadStateTest.class) {
MyThreadUtil.sleep(10000);
}
}, "thread4");
thread4.start(); // 演示 WAITING 状态
Thread thread5 = new Thread(() -> {
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "thread5");
thread5.start(); // 演示 BLOCKED 状态
Thread thread6 = new Thread(() -> {
synchronized (ThreadStateTest.class) {
MyThreadUtil.sleep(10000);
}
}, "thread6");
thread6.start();
// 等2秒 后查看状态
MyThreadUtil.sleep(2); log.debug("thread1 state = {}", thread1.getState()); // NEW
log.debug("thread2 state = {}", thread2.getState()); // RUNNABLE
log.debug("thread3 state = {}", thread3.getState()); // TERMINATED
log.debug("thread4 state = {}", thread4.getState()); // TIMED_WAITING
log.debug("thread5 state = {}", thread5.getState()); // WAITING
log.debug("thread6 state = {}", thread6.getState()); // BLOCKED
}
}

测试结果:

21:08:29 [thread3] DEBUG com.ldp.demo01.ThreadStateTest.33 -> running........
21:08:31 [main] DEBUG com.ldp.demo01.ThreadStateTest.65 -> thread1 state = NEW
21:08:31 [main] DEBUG com.ldp.demo01.ThreadStateTest.66 -> thread2 state = RUNNABLE
21:08:31 [main] DEBUG com.ldp.demo01.ThreadStateTest.67 -> thread3 state = TERMINATED
21:08:31 [main] DEBUG com.ldp.demo01.ThreadStateTest.68 -> thread4 state = TIMED_WAITING
21:08:31 [main] DEBUG com.ldp.demo01.ThreadStateTest.69 -> thread5 state = WAITING
21:08:31 [main] DEBUG com.ldp.demo01.ThreadStateTest.70 -> thread6 state = BLOCKED

5.区别

完美!

java中线程的6中状态的更多相关文章

  1. java中线程的几种状态和停止线程的方法

    1.线程的状态图 需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态 2.停止线程的两种方法 1)自然停止:线程体自然执行完毕 2)外部干涉:通过线程体标识 1.线程类中定义线程 ...

  2. 【Java】线程的 6 种状态

    一.线程状态的枚举 Java的线程从创建到销毁总共有6种状态.这些状态被定义在Thread类种的内部枚举 State 中,分别如下: 1.NEW:初始状态. 线程实例已创建,但未启动. // 实例创建 ...

  3. java实现线程的3中方式

    1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是 ...

  4. Java 多线程 线程的五种状态,线程 Sleep, Wait, notify, notifyAll

    一.先来看看Thread类里面都有哪几种状态,在Thread.class中可以找到这个枚举,它定义了线程的相关状态: public enum State { NEW, RUNNABLE, BLOCKE ...

  5. java中线程的状态详解

    一.线程的五种状态   线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以 ...

  6. 在java中怎样实现多线程?线程的4种状态

    一.在java中怎样实现多线程? extends Thread implement Runnable 方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 ...

  7. Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。

    java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...

  8. 并发基础(四) java中线程的状态

    一.程的五种状态   线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以也 ...

  9. Java线程池中线程的状态简介

    首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition ...

  10. java中线程状态

    刚开始接触java时,就觉得多线程是一个障碍,不容易理解,当时选择了跳过,不过工作一段时间后,发现这块还是需要深入研究一下的,及时平时工作中不使用多线程,但一定会使用web容器,比如tomcat,也是 ...

随机推荐

  1. 增补博客 第五篇 python 电子算盘

    [题目描述]设计一个电子算盘.要求绘制电子算盘界面,设计并实现打珠算过程(界面参考如下图示).界面右侧要求以图形绘制的方式绘制自画像,注意不能是图像文件显示的形式. 图 电子算盘参考界面示意 [练习要 ...

  2. react的类组件的ts写法

    react的类组件的ts写法,声明的变量,props和state的写法 import React, { PureComponent } from 'react'; interface Iprops { ...

  3. onreadystatechange 属性

    onreadystatechange 属性是 XMLHttpRequest 对象的一个事件处理器,用于在 XMLHttpRequest 对象的 readyState 属性发生变化时触发.这个属性通常用 ...

  4. Jenkins构建UI自动化项目,指定本地执行,没弹起浏览显示

    1. 原因分析 为什么执行web没有弹出浏览器,Jenkins日志显示正在执行中 jenkins是用windows installer 安装成 windows的服务了,那么启动windows后jenk ...

  5. python 第一次主要是if while 奇偶数的练习

    例如输出1-10的数字,但是7除外. a=1 while a < 11: if a == 7: pass else: print(a) a=a+1 输出1-100所以的偶数 a=1 while ...

  6. Git配置环境变量

    由于学习需要装了git,使用终端查看版本号时 提示 'git' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 原因 因为没有配置Git环境变量 解决方法:配置环境变量 开始菜单=>设置 ...

  7. ClickHouse介绍(三)MergeTree系列表引擎

    MergeTree系列表引擎 ClickHouse中最核心的引擎当属MergeTree系列引擎,其中基础表引擎为MergeTree,常用的表引擎还有ReplacingMergeTree.Summing ...

  8. Ubuntu 18.04安装xdrp以使用远程桌面

    背景 开发环境有一台服务器默认没有屏幕(被我拿走用来拓展屏幕了),有时候需要使用到界面但嫌弃拆显示器太麻烦,因此使用远程桌面来解决这个需求. 做法 安装xrdp sudo apt install -y ...

  9. welcome to chifan-duck's blog

    博主简介 截至至 2024 博主事一名初二学生. 为什么开博客园 因为博主是一名 Oier. 博客内容 OI 知识(科技)的普及 & 题解 为什么叫 chifan-duck ? 原本博主再各大 ...

  10. 基础篇:Stable Diffusion 基础原理详述

    [基础篇]Stable Diffusion 基础原理详述 前言 我认为学习 ComfyUI 应该先从理论学起. 与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同 ...