概述

  1). java.lang.Thread 类中定义了一个枚举 State, 定义了线程的六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW, /**
* Thread state for a runnable thread. A thread in the runnable
* state is executing in the Java virtual machine but it may
* be waiting for other resources from the operating system
* such as processor.
*/
RUNNABLE, /**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED, /**
* Thread state for a waiting thread.
* A thread is in the waiting state due to calling one of the
* following methods:
* <ul>
* <li>{@link Object#wait() Object.wait} with no timeout</li>
* <li>{@link #join() Thread.join} with no timeout</li>
* <li>{@link LockSupport#park() LockSupport.park}</li>
* </ul>
*
* <p>A thread in the waiting state is waiting for another thread to
* perform a particular action.
*
* For example, a thread that has called <tt>Object.wait()</tt>
* on an object is waiting for another thread to call
* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
* that object. A thread that has called <tt>Thread.join()</tt>
* is waiting for a specified thread to terminate.
*/
WAITING, /**
* Thread state for a waiting thread with a specified waiting time.
* A thread is in the timed waiting state due to calling one of
* the following methods with a specified positive waiting time:
* <ul>
* <li>{@link #sleep Thread.sleep}</li>
* <li>{@link Object#wait(long) Object.wait} with timeout</li>
* <li>{@link #join(long) Thread.join} with timeout</li>
* <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
* <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
* </ul>
*/
TIMED_WAITING, /**
* Thread state for a terminated thread.
* The thread has completed execution.
*/
TERMINATED;
}

  2). 通过 getState() 方法可以获取当前线程的状态

    public State getState() {
// get current thread state
return sun.misc.VM.toThreadState(threadStatus);
}

详细描述

  • NEW(新建状态): 线程对象被创建,还没有调用 start() 方法启动线程。
  • RUNNABLE(可运行状态):线程处于可运行状态,可能处于运行中,也可能在像进程一样在等待其他资源,例如 CPU 的调用。
  • BLOCKED(阻塞状态):线程被阻塞等待一个对象的监控锁(monitor lock),以进入同步代码块或同步方法或者重新进入同步代码块或者同步方法。
    重入的情况例如:在同步代码块或同步方法中调用 Object.wait 方法后进入等待状态(WAITING), 被唤醒(Object.notify 或 Object.notifyAll)后进入阻塞状态(BLOCKED),需要重新获得对象的监控锁(monitor lock),然后才执行 Object.wait 后面的代码。

  • WAITING(等待状态):线程可能因为执行了以下方法而进入等待状态

  1). Object#wait(),没有超时设置
  2). Thread#join(),没有超时设置
  3). LockSupport#park()

  一个进入WAITING(等待状态)的线程,需要另外的线程执行特别的动作才能将其唤醒:

  1). 一个线程执行了 Object.wait 进入等待状态,则需要另外的线程执行 Object.notify 或 Object.notifyAll 将其唤醒,注意 Object.notify 只会唤醒其中一个等待的线程,具体唤醒哪个是不确定的。

  2). 一个线程调用了另外一个线程的 join 方法,等需要等待另外一个线程运行结束,即处于TERMINATED(终止状态),才会被唤醒。

  3). 一个线程使用 LockSupport.park 进入等待状态,则另外的线程可以执行 LockSupport.unpark 将其唤醒。

  • TIMED_WAITING(有时间限制的等待状态):线程处于该状态会等待特定时间后被唤醒。线程可能因为执行了以下方法而进入有时间限制的等待状态:
    1). Object#wait(long timeout): 参数为毫秒
    2). Thread#join(long millis)
    3). Thread#sleep(long millis)
    4). LockSupport#parkNanos(long nanos)
    5). LockSupport#parkUntil(long deadline)

  • TERMINATED(终止状态):线程处于终止状态存在两种可能:
    1). 线程执行完 run() 方法
    2). 执行 run() 方法过程中抛出异常

测试代码】 

/**
1. 创建线程对象
NEW(新建状态):线程对象被创建,还没有调用 start() 方法启动线程 2. 启动线程:调用 start() 方法
RUNNABLE(可运行状态):线程正在等待 CPU 的调用
主线程暂停 100 ms, 让测试线程开始执行
RUNNABLE(可运行状态):线程开始执行 3.主线程先获得 obj 的监控锁(monitor lock), 测试线程进入阻塞状态
BLOCKED(阻塞状态):obj 的监控锁(monitor lock)被 主线程持有, 故测试线程进入阻塞状态, 等待获取 obj 的监控锁 (monitor lock)
RUNNABLE(可运行状态):测试线程获得 obj 的监控锁(monitor lock), 执行同步代码块代码 4.测试线程调用 Object#wait() 进入等待状态, 释放 obj 的监控锁(monitor lock)
WAITING(等待状态):测试线程需要被唤醒
主线程获得obj 的监控锁(monitor lock), 主线程调用 Object#notifyAll 唤醒等待线程
BLOCKED(阻塞状态):obj 的监控锁(monitor lock)被 main线程持有, 故测试线程进入阻塞状态, 等待获取 obj 的监控锁 (monitor lock)
RUNNABLE(可运行状态):测试线程被唤醒, 并重新获得 obj 的监控锁(monitor lock) 5.主线程暂停 100ms, 测试线程暂停 500 ms, 此时测试线程进入有时间限制的等待状态
TIMED_WAITING(有时间限制的等待状态):线程在特定时间的等待后会被唤醒 6.主线程暂停 1000 ms, 等待测试线程执行完成
TERMINATED(终止状态):线程已经执行完成
*/
public class Main { public static void main(String[] args) throws InterruptedException {
//1. 创建线程对象
System.out.println("1. 创建线程对象");
MyThread t = new MyThread();
System.out.println(t.getState() + "(新建状态):线程对象被创建,还没有调用 start() 方法启动线程"); //2. 启动线程:调用 start() 方法
System.out.println("\n2. 启动线程:调用 start() 方法");
t.start();
System.out.println(t.getState() + "(可运行状态):线程正在等待 CPU 的调用"); //3. 主线程抢先获得 obj 的监控锁 (monitor lock);
synchronized (t.obj) {
System.out.println("主线程暂停 100 ms, 让测试线程开始执行");
Thread.sleep(100); System.out.println("\n3.主线程先获得 obj 的监控锁(monitor lock), 测试线程进入阻塞状态");
System.out.println(t.getState() + "(阻塞状态):obj 的监控锁(monitor lock)被 main线程持有, 故测试线程进入阻塞状态, 等待获取 obj 的监控锁 (monitor lock)");
} //4.测试线程调用 Object#wait() 进入等待状态, 释放 obj 的监控锁(monitor lock)
Thread.sleep(100);//主线程等待 100 ms. 让测试先获得 obj 的监控锁 (monitor lock)
System.out.println(t.getState() + "(等待状态):测试线程需要被唤醒");
synchronized (t.obj) {
System.out.println("主线程获得obj 的监控锁(monitor lock), 调用 Object#notifyAll 唤醒等待线程");
t.obj.notifyAll(); //如果没有唤醒, 测试线程会一直处于等待状态
System.out.println(t.getState() + "(阻塞状态):obj 的监控锁(monitor lock)被 主线程持有, 故测试线程进入阻塞状态, 等待获取 obj 的监控锁 (monitor lock)");
} //5.主线程暂停 100ms, 测试线程暂停 500 ms, 此时测试线程进入有时间限制的等待状态
Thread.sleep(100);
System.out.println(t.getState() + "(有时间限制的等待状态):线程在特定时间的等待后会被唤醒"); //6.主线程暂停 1000 ms, 等待测试线程执行完成
System.out.println("\n6.主线程暂停 1000 ms, 等待测试线程执行完成");
Thread.sleep(1000);
System.out.println(t.getState() + "(终止状态):线程已经执行完成");
}
} class MyThread extends Thread{ public Object obj = new Object(); @Override
public void run(){
//线程开始进行业务处理
System.out.println(getState() + "(可运行状态):线程开始执行");
try {
//使线程进入 WAITING (等待状态)
synchronized (obj) {
System.out.println(this.getState() + "(可运行状态):测试线程获得 obj 的监控锁(monitor lock), 执行同步代码块代码");
//4.测试线程调用 Object#wait() 进入等待状态, 释放 obj 的监控锁(monitor lock)
System.out.println("\n4.测试线程调用 Object#wait() 进入等待状态, 释放 obj 的监控锁(monitor lock)");
obj.wait();
System.out.println(this.getState() + "(可运行状态):测试线程被唤醒, 并重新获得 obj 的监控锁(monitor lock)");
}
//5.测试线程进入 TIMED_WAITING (有时间限制的等待状态)
System.out.println("\n5.主线程暂停 100ms, 测试线程暂停 500 ms, 此时测试线程进入有时间限制的等待状态");
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}

  

B3. Cocurrent 线程的状态的更多相关文章

  1. java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍

       线程的概述:         线程是程序的多个执行路径,执行调度的单位,依托于进程存在.线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系 ...

  2. java 22 - 18 多线程之 线程的状态转换、线程组

    线程的状态转换图解:图片 线程的线程组: 线程组: 把多个线程组合到一起.    它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 publi ...

  3. iOS开发多线程篇—线程的状态

    iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(te ...

  4. 【学习总结】【多线程】 安全隐患 & 通讯 & 线程的状态

    一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数 ...

  5. Android(java)学习笔记72:线程的状态转换图以及常见执行情况

    1. 线程的状态转换图以及常见执行情况: 2. 线程状态类型: (1)新建状态(New):新创建了一个线程对象.(2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start() ...

  6. Java 线程的状态

    Java Thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  7. OC中线程的状态相关

    1.线程的状态NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; ...

  8. JAVA中线程的状态

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW:至今尚未启动的线程的状态. RUNNABLE:可运行线程的线程状态. ...

  9. Java多线程(一) —— 线程的状态详解

    一.多线程概述  1. 进程 是一个正在执行的程序.是程序在计算机上的一次运行活动. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 系统以进程为基本单位进行系统资源的调度 ...

随机推荐

  1. [Codeforces 507E] Breaking Good

    [题目链接] https://codeforces.com/contest/507/problem/E [算法] 首先BFS求出1到其余点的最短路 , N到其余点的最短路,记为distA[]和dist ...

  2. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  3. ASP.NET项目开发实战<<一键创建解决方案>>

    视频演示地址:http://www.youku.com/playlist_show/id_23192838.html 第一步:创建项目需要的数据库 打开辅助开发工具,如下图 从左侧菜单找到 项目数据库 ...

  4. Rails - ActiveRecord的where.not方法详解(copy)

    [说明:资料来自https://robots.thoughtbot.com/activerecords-wherenot] ActiveRecord's where.not Gabe Berke-Wi ...

  5. PostgreSQL完整备份与还原过程

    1. 备份10.12.2.100PC机(服务器)上的数据库(仅备份数据库和对应的数据库里面各表的结构): pg_dump -h 10.12.2.100 -U postgres -p 8101 -d t ...

  6. 转载别人的ognl

    一.循环遍历集合 1.在jsp中引入标准函数声明<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix=" ...

  7. HDU2604:Queuing(矩阵快速幂+递推)

    传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...

  8. bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】

    --因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...

  9. Xposed 集成 Android 6.0.1环境中,总结

    由于工作需要,需要将xposed集成到android源码中,生成新的ROM就自带xposed的功能. 下面大体上说一下步骤和遇到的问题. 1.下载,并编译android源码,成功. 2.下载 http ...

  10. python之计数统计

    前言: 计数统计,简单的说就是统计某一项出现的次数.实际应用中很多需求都需要用到这个模型,如检测样本中某一值出现的次数.日志分析某一消息出现的频率.分析文件中相同字符串出现的概率等等.以下是实现的不同 ...