Oracle JDK 定义中,线程一共有六种状态

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html

NEW:未启动状态

Thread t = new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
System.out.println(t.getState().name());

RUNNABLE:可运行状态

处于可运行状态的线程正在 Java 虚拟机中执行,但也可能是正在等待来自操作系统资源,例如 CPU。

Thread t = new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
t.start();
System.out.println(t.getState().name());

BLOCKED:阻塞状态

final Object lock = new Object();

Thread t = new Thread() {
@Override
public void run() {
synchronized (lock) {
System.out.println(Thread.currentThread().getName());
}
}
}; synchronized (lock) {
try {
t.start();
Thread.sleep(1000);
System.out.println(t.getState().name());
} catch (InterruptedException e) {
e.printStackTrace();
}
}

WAITING:等待状态

调用以下方法,使线程处于等待状态:

Object.wait()、Thread.join()、LockSupport.park()

另一个线程调用以下方法,使线程继续执行:

Object.notify()、 Object.notifyAll()、Thread.join()、LockSupport.unpark(Thread)
final Object lock = new Object();

Thread t = new Thread() {
@Override
public void run() {
try {
synchronized (lock) {
lock.wait();
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start(); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} synchronized (lock) {
System.out.println(t.getState().name());
lock.notifyAll();
}

TIMED_WAITING:具有指定时间的等待状态

调用以下方法,使线程处于指定时间的等待状态:

Thread.sleep()、Object.wait()、Thread.join()、LockSupport.parkNanos()、LockSupport.parkUntil()
Thread t = new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start(); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.getState().name());

TERMINATED:已终止线程的线程状态或线程已完成执行

Thread t = new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
t.start(); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.getState().name());

线程的状态图


https://blog.csdn.net/pange1991/article/details/53860651

JAVA-Thread 线程的几种状态的更多相关文章

  1. Java 多线程 线程的五种状态,线程 Sleep, Wait, notify, notifyAll

    一.先来看看Thread类里面都有哪几种状态,在Thread.class中可以找到这个枚举,它定义了线程的相关状态: public enum State { NEW, RUNNABLE, BLOCKE ...

  2. 【Java】线程的 6 种状态

    一.线程状态的枚举 Java的线程从创建到销毁总共有6种状态.这些状态被定义在Thread类种的内部枚举 State 中,分别如下: 1.NEW:初始状态. 线程实例已创建,但未启动. // 实例创建 ...

  3. java中线程的几种状态和停止线程的方法

    1.线程的状态图 需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态 2.停止线程的两种方法 1)自然停止:线程体自然执行完毕 2)外部干涉:通过线程体标识 1.线程类中定义线程 ...

  4. java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器

    多线程并发就像是内功,框架都像是外功,内功不足,外功也难得精要. 1.进程和线程的区别 一个程序至少有一个进程,一个进程至少有一个线程. 用工厂来比喻就是,一个工厂可以生产不同种类的产品,操作系统就是 ...

  5. 在java中怎样实现多线程?线程的4种状态

    一.在java中怎样实现多线程? extends Thread implement Runnable 方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 ...

  6. java 线程的几种状态(转载)

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

  7. 并发编程——Java线程的6种状态及切换

    前言 本次主要分享一下Java线程的六种状态及其转换. 如果对于线程的创建方式不太了解,推荐观看并发编程--认识java里的线程 线程的状态及其转换 操作系统线程的五种状态 新建(NEW) 就绪(RU ...

  8. JAVA 线程的6种状态

    JAVA线程的6种状态 线程状态(Thread.State).线程处于下列状态的其中之一. 一个线程在一个时刻只能有一个状态.这些状态是虚拟机线程状态,不能反应任何操作系统的线程状态. 通过Threa ...

  9. (转)Java结束线程的三种方法

    背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...

  10. Java结束线程的三种方法(爱奇艺面试)

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

随机推荐

  1. 【leetcode】566. Reshape the Matrix

    原题 In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a ne ...

  2. zabbix主动模式和被动模式

    目录 一. 理论概述 二.总结 一. 理论概述 整个zabbix监控过程当中,对于agent来说有两种递交监控项信息的模式:主动模式和被动模式 主动模式 agent向server主动请求对应监控项列表 ...

  3. U盘不能复制4G以上的单个文件如何处理?

    制作好雨后清风U盘启动盘后,有朋友在将雨后清风系统镜像文件拷贝传输至U盘时,会发现U盘提示文件过大,无法进行传输,但是U盘的剩余存储空间明显还足够,这是怎么回事呢? 其实这是U盘文件系统格式的原因,如 ...

  4. c# String 常用方法应用

  5. Linux命令——cp、rm、mv、touch、file、dir

    cp copy 拷贝文件 拷贝过程不指定目标文件名 则目标文件名和源文件名一样 [root@WebServer ~]# cp /91xueit/teacher.txt 51cto/ 拷贝过程指定目标文 ...

  6. Go语言——概念

    静态类型.动态类型.潜在类型 静态类型:指在变量声明中示出的那个类型.绝大多数类型都只有静态类型.唯独接口类型的变量例外,他除了拥有静态类型之外,还拥有动态类型. 动态类型:指在运行时与该变量绑定在一 ...

  7. webpack中使用WebpackDevServer实现请求转发

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. mxnet在windows使用gpu 出错

    1. cuda windows安装 官网下载 代码: import mxnet as mxfrom mxnet import ndfrom mxnet.gluon import nn a = nd.a ...

  9. 标准库类型之map

    使用map得包含map类所在的头文件#include <map> 定义一个map对象:map<string, int> mapTest;//用string作为索引,存储int对 ...

  10. 谷歌浏览器(Google Chrome)开发调试详细介绍

    很多Web前台开发者都喜欢这种浏览器自带的开发者工具,这对前台设计.代码调试很大帮助的. Chrome浏览器得益于其优秀的V8解释器,javascript执行速度和内存占有率表现非常优秀.对于html ...