@
线程状态 Thread.State
状态类型
在指定的时间点, 一个线程有且只有一种状态。 这些状态是 JVM 的状态, 他们并没有反映操作系统的状态。
定义
Thread 的状态是定义在 Thread 内部的枚举类型。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
在定义中, 我们知道共有 6 种类型。
说明
状态 | 说明 |
---|---|
NEW | 至今尚未启动的线程处于这种状态 |
RUNNABLE | 正在 Java 虚拟机中执行的线程处于这种状态。 因为可能在等待其他的资源, 比如处理器。 |
BLOCKED | 受阻塞并等待某个监视器锁的线程处于这种状态 |
WAITING | 无限期地等待另一个线程来执行。某一特定操作的线程处于这种状态 |
TIMED_WAITING | 等待另一个线程来执行。取决于指定等待时间的操作的线程处于这种状态 |
TERMINATED | 已退出的线程处于这种状态 |
状态转换
借用 《Java 并发编程的艺术》图一张
从以上的图可以看出,
- 线程创建后未启动未 「NEW」 状态, 通过 start() 函数转换为 「RUNNABLE」状态。
- 「RUNNABLE」 状态通过各函数, 可以与「WAITING」、「TIMED-WAITING」、「BLOCKED」 进行双向切换。
- 「RUNNABLE」 状态在线程结束后转换为 「TERMINATED」 状态。
也就是说, 全部的状态是以 「RUNNABLE」 为中心的。
状态验证
「NEW」-> 「RUNNABLE」 -> 「TERMINATED」
创建一个实现 Runnable 的类
public class StateTestThread implements Runnable{
public StateTestThread() {
// 此时的线程还是 main
System.out.println(Thread.currentThread().getName()+" state in Constructor:"+
Thread.currentThread().getState());
}
public void run() {
System.out.println(Thread.currentThread().getName()+" state in Run:"+
Thread.currentThread().getState());
}
}
创建一个测试类
public class ThreadStateTest {
public static void main(String[] args) {
StateTestThread stateTestThread = new StateTestThread();
Thread thread = new Thread(stateTestThread);
System.out.println(thread.getName()+" state after constructor:"
+thread.getState());
try {
Thread.sleep(1000L);
thread.start();
Thread.sleep(1000L);
System.out.println(thread.getName()+" state after run:"
+thread.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果
「RUNNABLE」 -> 「TIMED_WAITING」
public class ThreadStateTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
long begin = System.currentTimeMillis();
for (int i = 0; i < (1 << 25); i++) {
int j = (int) Math.sqrt(i);
// 该条件永远不成立, 只是为了计算
if (j * j > i) {
break;
}
}
long end = System.currentTimeMillis();
System.out.println("calculate end:"+(end - begin));
try {
System.out.println("begin sleep");
Thread.sleep(5000L);
System.out.println("end sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
try {
thread.start();
Thread.sleep(100L);
System.out.println(thread.getName()+" state :"
+thread.getState());
Thread.sleep(1000L);
System.out.println(thread.getName()+" state :"
+thread.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果如下:
Thread-0 的状态从 「RUNNABLE」 转化为 「TIMED_WAITING」
「RUNNABLE」 -> 「WAITING」
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
final Object lock = new Object();
public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
}
}
}
});
thread.start();
System.out.println(thread.getName()+" state :"
+thread.getState());
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getName()+" state :"
+thread.getState());
}
运行结果
「RUNNABLE」 -> 「BLOCKED」
先创建一个 Runnable 子类
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
final Object lock = new Object();
public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
}
}
}
});
thread.start();
System.out.println(thread.getName()+" state :"+thread.getState());
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getName()+" state :"+thread.getState());
}
测试方法
public static void main(String[] args) {
BlockedStateRun blockedStateRun = new BlockedStateRun();
Thread thread1= new Thread(blockedStateRun);
Thread thread2= new Thread(blockedStateRun);
thread1.setName("First");
thread1.start();
thread2.setName("Second");
thread2.start();
try {
Thread.sleep(200L);
System.out.println(thread1.getName()+"::"+thread1.getState());
System.out.println(thread2.getName()+"::"+thread2.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
最后的运行结果:
Java 多线程(三)之线程状态及其验证的更多相关文章
-
Java 多线程创建和线程状态
一.进程和线程 多任务操作系统中,每个运行的任务是操作系统运行的独立程序. 为什么引进进程的概念? 为了使得程序能并发执行,并对并发执行的程序加以描述和控制. 因为通常的程序不能并发执行,为使程序(含 ...
-
java多线程三之线程协作与通信实例
多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...
-
Java多线程系列--“JUC线程池”04之 线程池原理(三)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...
-
Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
-
Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
-
Java多线程——进程和线程
Java多线程——进程和线程 摘要:本文主要解释在Java这门编程语言中,什么是进程,什么是线程,以及二者之间的关系. 部分内容来自以下博客: https://www.cnblogs.com/dolp ...
-
Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗
在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...
-
Java多线程系列--“JUC线程池”02之 线程池原理(一)
概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...
-
Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
-
-1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
随机推荐
-
[Spark] Hello Spark
这里只使用Spark的Python操作和接口,其他语言应为不熟悉,所以先不写在这里. Spark 部署 可以直接从官方网站下载 pre-build 版本,可以直接在电脑上运行,离线安装也是可以的,比如 ...
-
select document library from certain list 分类: Sharepoint 2015-07-05 07:52 6人阅读 评论(0) 收藏
S using System; using Microsoft.SharePoint; namespace Test { class ConsoleApp { static void Main(str ...
-
XAMPP 在windows下无法启动Apache解决方案
XAMPP 在windows下无法启动Apache解决方案 一.现象 XAMPP 点击Start Apache时出现如下错误 20:41:12 [Apache] Error: Apache shut ...
-
aspnet_regiis 加密/解密 web.config
加密: @echo off echo web.config c: cd c:\windows\Microsoft.NET\Framework64\v4.0.30319 aspnet_regiis -p ...
-
SpringMVC开发过程中的中文乱码问题
相信大家在开发初期遇到中文乱码问题一定是一头雾水,不是数据库乱码了就是页面乱码了或者传值时乱码.其实解决乱码的途径很简单,就是统一编码与解码的类型,我把自己遇到的乱码问题整理出来,希望能够对大家有用. ...
-
PLEC-交流电机系统+笔记
1.固有机械特性近似图 2.三相交流电机的控制系统 1)理论推导 第一次制动选择能耗制动,第二次制动选择倒拉制动. 2)模型搭建 3)模拟仿真 3.心得体会和笔记总结 制动方式的选择主要是根据各个制动 ...
-
Redis和memcahce的区别【转】
先给大家讲一个基本知识点:数据库分类大致分为两类,关系型数据库和非关系型数据库.如果详细区分的话,还可以继续分下去. Redis不仅仅是缓存数据库 面试的时候,很多人会问,Redis和memcahce ...
-
2018-2019-2 20165236 《网络对抗技术》Exp4 恶意代码分析
2018-2019-2 20165236 <网络对抗技术>Exp4 恶意代码分析 一.1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行; 1.2是分析一个恶意软件, ...
-
前端性能优化成神之路--图片懒加载(lazyload image)
图片懒加载(当然不仅限于图片,还可以有视频,flash)也是一种优化前端性能的方式.使用懒加载可以想要看图片时才加载图片,而不是一次性加载所有的图片,从而在一定程度从减少服务端的请求 什么是懒加载 懒 ...
-
【MVC】Controller的使用
1,控制器中所有的动作方法必须声明为public,如声明为private或protected,将不被视为动作方法. 如果将Action声明为private,或者是添加[NonAction]属性,则不对 ...