深入理解Java多线程学习笔记-线程的状态
2018-04-21 22:55
691 查看
线程状态转换图
线程状态说明
NEW: 还没有启动的线程就处于这个状态,通常对应的就是还没有调用线程的start()方法
RUNNABLE: 可运行状态,同时包括正在运行的线程都是状态,通常对应的调用线程的start()方法后
BLOCKED: 阻塞状态,当线程获取不到锁就会进入阻塞状态,对应的就是进入synchronized块或方法不成功
WAITING: 等待状态,当调用Object.wait,Thread.join,LockSupport.part等方法线程会进入等待状态线程调用等待状态,通常需要另一个线程调用Object.notify,Object.notifyAll或LockSupport.unpart方法才能回到RUNNABLE状态
TIMED_WAITING: 超时等待状态,当调用Thread.sleep,Object.wait(long),Thread.join(long),
LockSupport.parkNanos,LockSupport.parkUntil等方法会进入超时等待状态
TERMINATED: 结束状态,当线程执行完成任务后进入结束状态或抛出异常后
验证线程状态中NEW和RUNNABLE的代码
public class ThreadState { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getState()); } }); System.out.println(thread.getState()); thread.start(); } }
运行上面的代码,控制台会输出线程的两种状态
验证线程的状态BLOCKED,WAITING,TIME_WAITING,TERMINATED的代码
备注:下面的代码来自《Java并发编程的艺术》
public class ThreadState { public static void main(String[] args) { new Thread(new TimeWaiting(), "TimeWaitingThead").start(); new Thread(new Waiting(), "WaitingThread").start(); new Thread(new Blocked(), "BlockedThread-1").start(); new Thread(new Blocked(), "BlockedThread-2").start(); } static class TimeWaiting implements Runnable { @Override public void run() { while (true) { SleepUtils.second(100); } } } static class Waiting implements Runnable { @Override public void run() { while (true) { synchronized (Waiting.class) { try { Waiting.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } static class Blocked implements Runnable { @Override public void run() { synchronized (Blocked.class) { while (true) { SleepUtils.second(100); } } } } }运行上面的代码,使用jstack工具即可查看线程的状态,如下图:
相关文章推荐
- 深入理解Java多线程学习笔记-守护线程
- 黑马程序员--Java学习笔记之多线程(自定义线程的两种方式对比、线程状态、线程安全)
- Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解
- Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解
- Java 多线程学习笔记 线程通讯 wait notify notifyAll的理解
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
- [原]Java多线程编程学习笔记之一:线程中断(含代码)
- Java学习笔记之深入理解引用
- Java多线程学习笔记1——线程的实现方式以及定时器的使用
- java笔记--关于多线程状态的理解和应用
- 0039 Java学习笔记-多线程-线程控制、线程组
- java多线程学习3-线程状态转换
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- java学习笔记-------对卡片布局管理器的深入理解
- JAVA学习笔记--多线程(二)线程常用方法
- (46)Java学习笔记——多线程 / 线程的生命周期
- 深入理解java虚拟机-学习笔记
- 【Java学习笔记之二十六】深入理解Java匿名内部类
- java多线程学习笔记2---理解原子性和可见性
- java学习多线程之线程状态