网站首页 > 精选教程 正文
上次进行了JAVA程序运行的原理分析,通过【JVM指令代码表】可以一步步,了解栈本地变量表和操作数栈,在栈线程中程序是如何运行的,这次咱们一起梳理下JAVA的线程状态。
(一)线程几种状态
线程的状态在java中有明确的定义,在java.lang.Thread.State中有6种。
- ① New
线程被创建,未执行和运行的时候
- ② Runnable
不代表线程在跑,两种:被cpu执行的线程,随时可以被cpu执行的状态。
- ③ Blocked
线程阻塞,处于synchronized同步代码块或方法中被阻塞。
- ④ Waiting
等待先生的线程状态。线程当前不执行,如果被其他唤醒后会继续执行的状态。依赖另一个线程的通知的。这个等待是一直等,没人叫你,你起不来。
- ⑤ Time Waiting
指定等待时间的等待线程的线程状态。带超时的方式:Thread.sleep,Object.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil
- ⑥ Terminated
正常执行完毕或者出现异常终止的线程状态。
(二)线程状态流程解析
(三)线程的几种状态切换代码演示
public class Demo2 { public static Thread thread1; public static Demo2 obj; public static void main(String[] args) throws Exception { // 第一种状态切换 - 新建 -> 运行 -> 终止 System.out.println("#######第一种状态切换 - 新建 -> 运行 -> 终止################################"); Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("thread1当前状态:" + Thread.currentThread().getState().toString()); System.out.println("thread1 执行了"); } }); System.out.println("没调用start方法,thread1当前状态:" + thread1.getState().toString()); thread1.start(); Thread.sleep(2000L); // 等待thread1执行结束,再看状态 System.out.println("等待两秒,再看thread1当前状态:" + thread1.getState().toString()); // thread1.start(); TODO 注意,线程终止之后,再进行调用,会抛出IllegalThreadStateException异常 System.out.println(); System.out.println("############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################"); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try {// 将线程2移动到等待状态,1500后自动唤醒 Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread2当前状态:" + Thread.currentThread().getState().toString()); System.out.println("thread2 执行了"); } }); System.out.println("没调用start方法,thread2当前状态:" + thread2.getState().toString()); thread2.start(); System.out.println("调用start方法,thread2当前状态:" + thread2.getState().toString()); Thread.sleep(200L); // 等待200毫秒,再看状态 System.out.println("等待200毫秒,再看thread2当前状态:" + thread2.getState().toString()); Thread.sleep(3000L); // 再等待3秒,让thread2执行完毕,再看状态 System.out.println("等待3秒,再看thread2当前状态:" + thread2.getState().toString()); System.out.println(); System.out.println("############第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止###########################"); Thread thread3 = new Thread(new Runnable() { @Override public void run() { synchronized (Demo2.class) { System.out.println("thread3当前状态:" + Thread.currentThread().getState().toString()); System.out.println("thread3 执行了"); } } }); synchronized (Demo2.class) { System.out.println("没调用start方法,thread3当前状态:" + thread3.getState().toString()); thread3.start(); System.out.println("调用start方法,thread3当前状态:" + thread3.getState().toString()); Thread.sleep(200L); // 等待200毫秒,再看状态 System.out.println("等待200毫秒,再看thread3当前状态:" + thread3.getState().toString()); } Thread.sleep(3000L); // 再等待3秒,让thread3执行完毕,再看状态 System.out.println("等待3秒,让thread3抢到锁,再看thread3当前状态:" + thread2.getState().toString()); } }
PS:通过API,演示前面说的几种状态,通过图和代码让大家对这6种状态了解透彻,线程状态的知识点就讲解到这里。下次咱们继续说说线程,一起说说线程终止。
- 上一篇: java中线程的状态
- 下一篇: Java线程的6种状态详解
猜你喜欢
- 2024-11-18 Java并发编程线程状态转换
- 2024-11-18 Java面试必考问题:线程的生命周期
- 2024-11-18 Java 19 虚拟线程的状态变化,停驻与锁定
- 2024-11-18 Java线程生命周期详解?
- 2024-11-18 线程从创建最终消亡,要经历的若干状态,你了解其中的多少?
- 2024-11-18 java线程状态之WAITING(等待)
- 2024-11-18 浅谈Java线程:线程基础知识扫盲
- 2024-11-18 Java线程在各个状态下调用start方法会发生什么事情?
- 2024-11-18 为什么Java中线程没有Running状态
- 2024-11-18 阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)