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. Apollo启动配置排查,超时时间的配置

    Apollo启动配置排查 1.排查下来是 本地的服务 apollo 配置fake发布到线上去了.2.或者是引用的apollo jar包中指向的apollo服务器地址是否正确. 3.超时时间的配置 ## ...

  2. Docker PHP如何启用MySQL扩展

    我下载的镜像是PHP7版本:docker pull php:7.4.30-fpm,容器起名为php7 PHP镜像官方提供了帮助文档,其中提到了相关的命令,这里推荐一篇博客,该博客对于扩展的几个相关命令 ...

  3. LiveCharts2:简单灵活交互式且功能强大的.NET图表库

    前言 之前的文章中提到过ScottPlot.与oxyplot,这两个是比较常用的.NET图表库,今天介绍一款新的.NET图表库:LiveCharts2. LiveCharts2介绍 LiveChart ...

  4. 工具类——EventManager

    EventManager using UnityEngine; using System.Collections; using System.Collections.Generic; using Un ...

  5. java datetime数据类型去掉时分秒

    在Java中,如果我们想要表示一个日期而不包括时间(时分秒),我们通常会使用java.time包中的LocalDate类.LocalDate是一个不可变的日期对象,它只包含年.月.日三个字段. 1. ...

  6. 认真学习css3-2-css的选择器

    关于有哪些选择器,具体可以查看w3school. 本文写了一个考卷的例子,带有部分js,jquery.不会针对每个选择器做示例,只练习了一些常用的,有意思的. 先看html/js代码: <!DO ...

  7. throws和try catch的区别

    1.throws是表明方法抛出异常,需要调用者来处理,如果不想处理就一直向外抛,最后会有jvm来处理: 2.try catch 是自己来捕获别人抛出的异常,然后在catch里面去处理: 一般情况下,第 ...

  8. CF911G 题解

    考虑分块. 如果你做过未来日记就会知道一个很明显的做法--值域并查集. 先考虑整块: 块内没有 \(x\) 则跳过本次操作. 块内有 \(x\) 没有 \(y\) 则令 \(fa[x] = y\) 块 ...

  9. Mybatis 中 foreach 的四种用法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...

  10. SDL3 入门(5):纹理渲染

    创建纹理 有三个 API 可以用来创建纹理: SDL_CreateTexture 参数少,使用方便,适用于创建简单的纹理 SDL_CreateTextureFromSurface 适用于从已有图像数据 ...