作者:( •̀ ω •́ )y

出处:https://www.cnblogs.com/laishenghao/p/13972421.html

一、线程状态的枚举

Java的线程从创建到销毁总共有6种状态。这些状态被定义在Thread类种的内部枚举 State 中,分别如下:

1、NEW:初始状态。

线程实例已创建,但未启动。

// 实例创建后,初始状态为 NEWThread thread = new Thread();

2、RUNNABLE:运行状态。

线程正在JVM中执行或等待操作系统资源(如CPU),包含 Ready(就绪)状态和 Running(运行中)状态。

(1) Ready 状态:该线程在可运行的状态,但在此刻线程调度器并没有选择执行该线程。

(2) Running 状态:此刻线程调度器选择执行该线程,线程得到了CPU的时间片资源。

3、BLOCKED:阻塞状态。

线程在等待获取监视器锁资源,以便进入 synchronized 标记的方法或者代码块。

4、WAITING:等待状态。

当调用以下方法后,线程将进入等待状态:

(1) Object.wait(); // 调用不带超时参数的 wait() 方法。

(2) anotherThread.join(); // 调用另一个线程的不带超时参数的 join() 方法。

(3) LockSupport.park(); / / 无限期挂起当前线程。

5、TIMED_WAITING:超时等待状态。

指定了超时时间的等待状态。当线程调用了如下方法后,线程将进入超时等待状态:

(1) Thread.sleep(long millis)Thread.sleep(long millis, int nanos)

(2) Object.wait(long timeout)Object.wait(long timeout, int nanos)

(3) anotherThread.join(long millis)anotherThread.join(long millis, int nanos)

(4) LockSupport.parkNanos(Object blocker, long nanos)LockSupport.parkUntil(Object blocker, long deadline)

可以看到,跟 WAITING 状态相比,引起 TIMED_WAITING 状态的方法,主要是多了超时参数。

6、TERMINATED:终止状态。

线程执行完成或被中断,将进入终止状态。进入终止状态后的线程,无法重启启动。

如果再次调用 start() 方法,将会抛出 IllegalThreadStateException 异常。

调用 run() 方法也不会有任何效果,线程内部的 Runnable 对象也已经被释放。

二、线程状态的转换

Java线程状态的转换过程,如下图所示。

三、线程状态的获取

当前线程的状态可以通过 Thread.currentThread().getState() 获取。显然,获取自己的状态,得到的肯定是运行状态。

一个线程实例的状态,可以通过 thread.getState() 方法获取。

public class Main {    public static void main(String[] args) throws InterruptedException {        Thread thread = new Thread(() -> {            // running:RUNNABLE            System.out.println("running:" + Thread.currentThread().getState());            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        });        // before start():NEW        System.out.println("before start():" + thread.getState());        thread.start();        // 暂停一下主线程        Thread.sleep(100);        // 由于线程内sleep了1秒,此时将处于有限时间等待状态        // after start():TIMED_WAITING        System.out.println("after start():" + thread.getState());        // 等待线程结束        thread.join();        // thread state:TERMINATED        System.out.println("thread state:" + thread.getState());    }}

测试Lock对应的线程状态:

public class Main {    private static final Lock LOCK = new ReentrantLock();    private static volatile int value = 0;    public static void main(String[] args) throws InterruptedException {        Thread alice = new Thread(() -> testLock("Alice"));        Thread bob = new Thread(() -> testLock("Bob"));        // alice before start():NEW        System.out.println("alice before start():" + alice.getState());        alice.start();        // 暂停一下主线程        Thread.sleep(100);        bob.start();        Thread.sleep(100);        // bob.getState():WAITING        System.out.println("bob.getState():" + bob.getState());        value = 1000;    }​    static void testLock(String name) {        // 注意:锁住的是代码块,不是里面用到的变量、资源        LOCK.lock();        try {            System.out.println("Lock block code, name=" + name);            // 注意:这是非线程安全的操作            value += 10;            System.out.println("Before sleep(): name=" + name + ",value=" + value);            Thread.sleep(1000);            System.out.println("After sleep(): name=" + name + ",value=" + value);        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            LOCK.unlock();        }    }}

由上面的例子可见,等待进入 Lock.lock() 代码块的线程的状态,是 WAITING 状态,而不是 BLOCKED。

如果调用的是 Lock.tryLock(long, TimeUnit) 方法,对应的状态将是 TIMED_WAITING。

作者:( •̀ ω •́ )y

出处:https://www.cnblogs.com/laishenghao/p/13972421.html

c++thread里暂停线程_Java线程的 6 种状态相关推荐

  1. 简述java的线程_JAVA线程简述

    一.先谈谈并行与并发: 并行:是指两个或多个事件在同一时刻发生. 并发:是指连个或多个事件在同一时间间隔内发生. 二.接下来我们进入正题,讨论一下线程和进程: 1)什么是线程和进程? 进程:是一个具有 ...

  2. java怎么看具体被挂起的线程_Java线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

  3. java 精灵线程_Java线程的状态分析

    /*** 线程的状态分析 *@authoraa **/ public classThreadState {public static void main(String[] args) throwsEx ...

  4. 抽象类java启动线程_java 线程复习笔记

    1. 线程基本概念 1.1 线程与进程 当一个程序进入内存运行时,即变成一个进程.进程是系统进行资源分配和调度的一个独立单元. 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程 ...

  5. java 设置主线程_Java线程编程中的主线程讲解

    当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程(main thread),因为它是程序开始时就执行的.主线程的重要性体现在两方面: 它是产生其他子线程的线程: 通常它必须最后完成执 ...

  6. java 优化线程_JAVA线程优化

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

  7. java 切换主线程_Java线程状态及切换、关闭线程的正确姿势分享

    前言 在讲线程之前有必要讨论一下进程的定义:进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位.进程实体由程序段, 数据段 PCB(进程控制块)组成.线程又是什么?线程可以 ...

  8. java 限时线程_Java线程中的七种状态

    新建状态(New) 当用new操作符创建一个线程后, 例如new Thread(r),此时线程处在新建状态. 当一个线程处于新建状态时,线程中的任务代码还没开始运行. 就绪状态(Runnable) 也 ...

  9. java中断线程_Java线程中断机制-如何中断线程

    介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...

最新文章

  1. 基于 Lucene 的桌面文件搜索
  2. atitit.Sealink2000国际海运信息管理系统
  3. Android小结(1)
  4. Android风格与主题
  5. zabbix PHP databases support off Fail
  6. OpenCV 使用 FLANN 库实现特征匹配
  7. 华为云IoT体验:基于IoT平台构建智慧路灯应用
  8. python怎么做成app_自己怎么做App软件 自己制作APP教程
  9. flash builder 4 序列号
  10. Python语音识别终极指北,没错,就是指北!
  11. RabbitMQ基础
  12. 实变函数自制笔记6:初识可测函数
  13. php相册照片批量修改,怎么批量修改图片尺寸 批量修改图片大小
  14. [会员积分运营了解]各大主流电商平台会员及积分体系概况集合!
  15. JZOJ 5602. 【NOI2018模拟3.26】Cti
  16. vr虚拟现实技术前景怎么样?虚拟展示技术应用介绍
  17. Oracle的trunc函数与MySQL(Maria)的truncate函数
  18. 【ceph】ceph osd blacklist cep黑名单|MDS问题分析
  19. 项目运营第一天——狂风暴雨
  20. 魔兽争霸微操地图的使用

热门文章

  1. kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...
  2. java判断日期是否是同一周_JAVA里面怎样判断一个日期是否是星期六或者星期天,给出原代码,多谢!!!!!!!!!!...
  3. python 日志不会按照日期分割_python 按照日期切分大日志文件(重点)和按照指定大小切分日志文件...
  4. 鸿蒙手机是个噱头,华为鸿蒙不是谈判噱头 必要时会应用手机当中!
  5. mysql删除外键_MySQL删除外键定义的方法
  6. 腾讯TIM自动回复内容怎么自定义添加
  7. win7系统丢失文件的处理方法
  8. Dubbo:RPC原理
  9. springboot基于mybatis扫描jar包中的controller、service、dao、xml
  10. RegExp:正则表达式对象