Java线程生命周期图文详细讲解
作者:健鑫. 发布时间:2022-07-17 05:22:32
线程的状态
New
表示线程已创建,没启动的状态
此时已经做了一些准备工作,还没有执行run方法中代码
Runnable
调用start方法之后的状态,表示可运行状态(不一定正在运行,因为调用start方法之后不一定立即运行)
如果线程拿到CPU资源,但是突然资源被抢走,这个线程依然处于Runnable
Blocked
线程进入到被synchronized修饰的代码块时,该锁已经被其他线程拿走,此时该线程处于Blocked
Blocked只针对synchronized
Waiting
没有设置时间参数的Object.wait方法可使线程状态变为waiting
Timed Waiting
相对Waiting,有了时间参数
Terminated
执行完毕
run方法正常执行完毕
或者出现了一个没有被捕获的异常终止了run方法
代码演示
展示线程的New、Runnable、Terminated状态
线程刚被new处于NEW状态
调用start方法处于RUNNABLE状态
程序正在执行处于RUNNABLE状态而不是RUNNING
程序结束处于TERMINATED状态
public class NewRunnableTerminated implements Runnable {
public static void main(String[] args) {
Thread thread = new Thread(new NewRunnableTerminated());
// 打印线程状态
// New
System.out.println(thread.getState());
thread.start();
// Runnable
System.out.println(thread.getState());
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// Runnable
System.out.println(thread.getState());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// TERMINATED
System.out.println(thread.getState());
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
}
}
/*
* NEW
RUNNABLE
RUNNABLE
* TERMINATED
* */
演示waiting、Blocked、Timed Waiting
中间频繁调用sleep方法是防止代码执行太快,达不到应有的效果
线程被调用sleep,处于TIMED_WAITING
当一个线程执行synchronized内的代码,另一个线程也要执行则该线程处于BLOCKED
线程执行wait方法,处于WAITING
public class BlockWaitingTimedWaiting implements Runnable{
public static void main(String[] args) {
BlockWaitingTimedWaiting blockWaitingTimedWaiting = new BlockWaitingTimedWaiting();
Thread thread1 = new Thread(blockWaitingTimedWaiting);
thread1.start();
Thread thread2 = new Thread(blockWaitingTimedWaiting);
thread2.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread1.getState());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread2.getState());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread1.getState());
}
@Override
public void run() {
syn();
}
private synchronized void syn() {
try {
Thread.sleep(1000);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* TIMED_WAITING
BLOCKED
WAITING
* */
阻塞状态
一般而言,Blocked、Waiting、Timed_waiting都被称之为阻塞状态
在阻塞状态下,什么时候可以继续执行是不受控制的
来源:https://blog.csdn.net/weixin_62759952/article/details/128764220


猜你喜欢
- 1、Java版package com.lyz.utils.common; import java.io.UnsupportedEncodin
- No ‘Access-Control-Allow-Origin‘ header is present
- 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的
- 本篇文章主要介绍了Android 三方库混淆规则,分享给大家,具体如下:基本指令-optimizationpasses 5-dontusem
- Mybatis基础回顾与高级应用数据库:mysql5.7jdk:15引入依赖<!--引入依赖--> &
- activity A和BA 获取数据的activity B返回数据的activity点击A上的按钮,在A的textview上显示
- 前言相信小伙伴一定用过 @Transaction 注解,那 @Transaction 背后的秘密又知道多少呢?Spring 是如何开启事务的
- 以前,使用github(git)结合 IntelliJ IDEA ,可以把自己本地的测试代码,使用github网站,添加到版本管理。这样就可
- 前言在上一篇文章中,我们分析了Spring中Bean的实例化过程,在结尾我们知道了虽然bean的实例化完成了,但是其中的属性还没有被注入,今
- 回调函数就像activities一样,fragments也有它们自己的生命周期。理解fragments的生命周期,可以使你在它们被销毁的时候
- 接触了这么久的View,总不能一直停留在View里,现在开始呢,就要学习一个新的知识点:SurfaceView,实际上SurfaceView
- 1. 启动入口本系列RocketMQ4.8注释github地址,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈前面我们已经分析完
- 在Java中对集合进行操作时,有时候需要对类中的equals() 和 hashCode()进行方法重写.IDEA中实现了利用快捷键即可对上述
- java中实现list或set转map的方法在开发中我们有时需要将list或set转换为map(比如对象属性中的唯一键作为map的key,对
- 本小节内容不多,但是个人感觉比较独立,还是拿出来单讲吧。在开发 IntelliJ Plugin 时,如果需要用到 Gson、OKHttp 等
- 手机二维码扫码登录已经成为了现代互联网时代的一种普遍的登录方式。它的出现,极大地方便了用户登录的流程,减少了用户输入用户名和密码的麻烦。在二
- public void PrintPercentage(int FinishedCount, int TotalCount) {
- 刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向
- 下面是配置Android开发ADB环境变量的操作步骤。工具/原料win7系统电脑+Android SDK方法/步骤1.首先右击计算机——属性
- java引用传递的三种类型我这里使用了mldn视频里的例子,只用于学习交流。第一种结果:调用前:50调用后:1000分析:理解:好理解第二种