Java Thread 线程的几种状态
2023-09-27 14:23:43 时间
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()
另一个线程调用以下方法,使线程继续执行:
notify() 是随机唤醒的,不同的 JDK 版本,在等待队列中唤醒的线程,其位置在等待队列中不同。
JDK1.8 中 notify() 唤醒的是等待队列中的头节点(等待时间最长的那个线程)
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());
线程的状态图
相关文章
- Java并发编程(01):线程的创建方式,状态周期管理
- Java Scanner 类
- 关于 java 的动态绑定机制
- 【Java】Collection集合和Map集合(List、Set、HashMap、TreeMap)
- java对国际化的支持
- 雪习新知识:Java 内部类
- Java数据类型—String进阶之字符串常量池
- Java线程的6种状态及切换(透彻讲解)
- 并发编程--JMM JAVA内存模型的概念及解决的问题总结
- 设计模式java——状态模式
- 详解Java线程的几种状态
- 干货 | 教你如何监控 Java 线程池运行状态
- 谈谈 Java 线程状态相关的几个方法
- Java中必须了解的常用类
- Java线程及线程池状态
- java什么是方法(Method)?
- java中公平锁和非公平锁的通俗解释
- java_线程的几种状态
- 浅析Java中不使用的对象应赋值为null的深层理解:基本没必要的原因、JVM中局部变量表(运行时候的栈状态)和slot(运行时栈里的索引)的理解、Java的栈优化(重用栈索引节约内存空间)、GC的可达性分析算法-如何找到root树根(栈中引用的对象)、如何断开栈中引用与堆的联系(重写栈索引)
- 浅析Java的线程池:介绍、优势、设计思路(类比工厂)、参数介绍、任务队列、4种拒绝策略、5种状态
- Java spring mvc jsp excel 导入
- !!!!!!!Unbuntu中Java安装配置
- 新鲜出炉关于2017年Java就业前景分析
- java 并发官方教程
- Java小白入门200例01之基本打印输出
- Java中的锁以及sychronized实现机制
- Java 多线程七大状态