c++thread里暂停线程_Java线程的 6 种状态
作者:( •̀ ω •́ )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 种状态相关推荐
- 简述java的线程_JAVA线程简述
一.先谈谈并行与并发: 并行:是指两个或多个事件在同一时刻发生. 并发:是指连个或多个事件在同一时间间隔内发生. 二.接下来我们进入正题,讨论一下线程和进程: 1)什么是线程和进程? 进程:是一个具有 ...
- java怎么看具体被挂起的线程_Java线程的挂起、恢复和终止
有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...
- java 精灵线程_Java线程的状态分析
/*** 线程的状态分析 *@authoraa **/ public classThreadState {public static void main(String[] args) throwsEx ...
- 抽象类java启动线程_java 线程复习笔记
1. 线程基本概念 1.1 线程与进程 当一个程序进入内存运行时,即变成一个进程.进程是系统进行资源分配和调度的一个独立单元. 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程 ...
- java 设置主线程_Java线程编程中的主线程讲解
当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程(main thread),因为它是程序开始时就执行的.主线程的重要性体现在两方面: 它是产生其他子线程的线程: 通常它必须最后完成执 ...
- java 优化线程_JAVA线程优化
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- java 切换主线程_Java线程状态及切换、关闭线程的正确姿势分享
前言 在讲线程之前有必要讨论一下进程的定义:进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位.进程实体由程序段, 数据段 PCB(进程控制块)组成.线程又是什么?线程可以 ...
- java 限时线程_Java线程中的七种状态
新建状态(New) 当用new操作符创建一个线程后, 例如new Thread(r),此时线程处在新建状态. 当一个线程处于新建状态时,线程中的任务代码还没开始运行. 就绪状态(Runnable) 也 ...
- java中断线程_Java线程中断机制-如何中断线程
介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...
最新文章
- 基于 Lucene 的桌面文件搜索
- atitit.Sealink2000国际海运信息管理系统
- Android小结(1)
- Android风格与主题
- zabbix PHP databases support off Fail
- OpenCV 使用 FLANN 库实现特征匹配
- 华为云IoT体验:基于IoT平台构建智慧路灯应用
- python怎么做成app_自己怎么做App软件 自己制作APP教程
- flash builder 4 序列号
- Python语音识别终极指北,没错,就是指北!
- RabbitMQ基础
- 实变函数自制笔记6:初识可测函数
- php相册照片批量修改,怎么批量修改图片尺寸 批量修改图片大小
- [会员积分运营了解]各大主流电商平台会员及积分体系概况集合!
- JZOJ 5602. 【NOI2018模拟3.26】Cti
- vr虚拟现实技术前景怎么样?虚拟展示技术应用介绍
- Oracle的trunc函数与MySQL(Maria)的truncate函数
- 【ceph】ceph osd blacklist cep黑名单|MDS问题分析
- 项目运营第一天——狂风暴雨
- 魔兽争霸微操地图的使用
热门文章
- kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...
- java判断日期是否是同一周_JAVA里面怎样判断一个日期是否是星期六或者星期天,给出原代码,多谢!!!!!!!!!!...
- python 日志不会按照日期分割_python 按照日期切分大日志文件(重点)和按照指定大小切分日志文件...
- 鸿蒙手机是个噱头,华为鸿蒙不是谈判噱头 必要时会应用手机当中!
- mysql删除外键_MySQL删除外键定义的方法
- 腾讯TIM自动回复内容怎么自定义添加
- win7系统丢失文件的处理方法
- Dubbo:RPC原理
- springboot基于mybatis扫描jar包中的controller、service、dao、xml
- RegExp:正则表达式对象