线程八大基础核心四(线程生命周期)

1.引子

在java多线程并发编程中,有八大基础核心。考考你:
看看都有哪八大基础核心呢?它们分别是:
1.创建线程的方式
2.线程启动
3.线程停止
4.线程生命周期
5.线程相关的方法
6.线程相关的属性
7.线程异常处理
8.线程安全

今天我们从第四个基础核心开始:线程生命周期

2.考考你

#前情回顾:
在java编程语言中,从线程创建,到线程执行结束,会经过一系列状态的转化,称为线程的生命周期

#考考你:
1.你知道线程生命周期中有哪些状态吗?
2.你知道各种状态对应的含义吗?

3.一图胜千言

我们通过一幅图,展示线程生命周期中各种状态的转换。

4.状态转换案例

4.1.状态:NEW/RUNNABLE/TERMINATED

通过该案例,演示线程的NEW/RUNNABLE/TERMINATED状态。

 1 package com.anan.thread.threadstate;
 2
 3 import java.util.concurrent.TimeUnit;
 4
 5 /**
 6  * 演示线程状态:NEW/RUNNABLE/TERMINATED
 7  */
 8 public class ThreadStateDemo1 {
 9
10     public static void main(String[] args) throws InterruptedException{
11         // 创建线程对象
12         String tName = "my-thread";
13         Runnable r1 = new MyRunnable();
14         Thread t1 = new Thread(r1,tName);
15
16         // 输出线程状态:NEW
17         System.out.println("1.新建线程:" + tName + "当前状态:" + t1.getState());
18
19         // 启动线程,等待1毫秒,输出线程状态:RUNNABLE
20         t1.start();
21         TimeUnit.MILLISECONDS.sleep(1);
22         System.out.println("2.启动线程后:" + tName + "当前状态:" + t1.getState());
23
24         // 发送中断信号,等待1毫秒,输出线程状态:TERMINATED
25         t1.interrupt();
26         TimeUnit.MILLISECONDS.sleep(1);
27         System.out.println("3.给线程发送中断信号后:" + tName + "当前状态:" + t1.getState());
28
29     }
30 }
31
32 /**
33  * 实现Runnable接口,创建线程
34  */
35 class MyRunnable implements Runnable{
36     public void run() {
37         while (!Thread.currentThread().isInterrupted()){
38             ;// 不断循环,等待中断信号发生,然后结束线程运行
39         }
40         System.out.println("中断信号发生," + Thread.currentThread().getName() + "准备结束运行.");
41     }
42 }

4.2.状态:BLOCKED

通过该案例,演示线程的BLOCKED状态。业务描述:

1.模拟获取共享资源银行:Bank账户余额信息,在获取账户余额时,需要加上同步锁

2.创建两个线程,并发获取银行账户余额,模拟当一个线程加锁操作中,另外一个线程只能阻塞等待

3.在主线程中,输出两个线程的状态

 1 package com.anan.thread.threadstate;
 2
 3 import java.util.concurrent.TimeUnit;
 4
 5 /**
 6  * 演示线程状态:BLOCKED
 7  */
 8 public class ThreadStateBlockedDemo {
 9     // 公共锁对象
10     public static final Object LOCK = new Object();
11
12     /**
13      * 2.创建两个线程,并发获取银行账户余额,
14      * 模拟当一个线程加锁操作中,另外一个线程只能阻塞等待
15      */
16     public static void main(String[] args) {
17
18         // 创建Runnable对象
19         Runnable r1 = new MyRunnable1();
20
21         // 创建两个线程对象
22         String tName_1 = "my-thread-1";
23         Thread t1 = new Thread(r1,tName_1);
24
25         String tName_2 = "my-thread-2";
26         Thread t2 = new Thread(r1,tName_2);
27
28         // 启动线程t1,t2
29         t1.start();
30         t2.start();
31
32         // 输出两个线程:t1,t2当前状态
33         System.out.println("1.主线程"+ Thread.currentThread().getName() +
34                 "打印,线程:" + t1.getName() + "当前状态:" + t1.getState());
35         System.out.println("2.主线程"+ Thread.currentThread().getName() +
36                 "打印,线程:" + t2.getName() + "当前状态:" + t2.getState());
37
38
39     }
40
41     /**
42      * 1.模拟获取共享资源银行:Bank
43      * 账户余额信息,在获取账户余额时,需要加上同步锁
44      */
45     public static void getBankMoney() {
46         synchronized (LOCK){
47             System.out.println(Thread.currentThread().getName() + "线程,获取到锁###.");
48             // 休眠1秒,模拟业务操作
49             try {
50                 TimeUnit.SECONDS.sleep(1);
51                 // 打印输出账户余额
52                 System.out.println("线程:" + Thread.currentThread().getName() +
53                 "获取到账户余额了......");
54             } catch (InterruptedException e) {
55                 e.printStackTrace();
56             }
57         }
58
59         System.out.println(Thread.currentThread().getName() + "线程,释放锁###.");
60     }
61
62 }
63
64 /**
65  * 实现Runnable接口,创建线程
66  */
67 class MyRunnable1 implements Runnable{
68
69     public void run() {
70         // 获取账户余额
71         ThreadStateBlockedDemo.getBankMoney();
72     }
73 }

4.3.状态:WAITING

通过该案例,演示线程的WAITING状态。

 1 package com.anan.thread.threadstate;
 2
 3 import java.util.concurrent.TimeUnit;
 4
 5 /**
 6  * 演示线程状态:WAITING
 7  */
 8 public class ThreadStateWaitingDemo {
 9
10     // 创建公共锁
11     public final static Object LOCK = new Object();
12
13     public static void main(String[] args) throws InterruptedException{
14         // 创建线程对象
15         Runnable r1 = new MyRunnable3();
16         String tName_1 = "my-thread-1";
17         Thread t1 = new Thread(r1,tName_1);
18
19         // 启动线程,休眠1秒后,获取线程状态
20         t1.start();
21         TimeUnit.SECONDS.sleep(1);
22         System.out.println("1.主线程"+ Thread.currentThread().getName() +
23                 "打印,线程:" + t1.getName() + "当前状态:" + t1.getState());
24
25         // 主线程唤醒t1线程,再次输出线程状态
26         synchronized (LOCK){
27             LOCK.notify();
28         }
29         TimeUnit.SECONDS.sleep(1);
30         System.out.println("2.主线程"+ Thread.currentThread().getName() +
31                 "打印,线程:" + t1.getName() + "当前状态:" + t1.getState());
32     }
33 }
34
35 /**
36  * 实现Runnable接口,创建线程
37  */
38 class MyRunnable3 implements Runnable{
39
40     public void run() {
41         System.out.println("线程:" + Thread.currentThread().getName() +
42                 "即将进入等待:ThreadStateWaitingDemo.LOCK.wait(),等待主线程输出状态.");
43         synchronized (ThreadStateWaitingDemo.LOCK){
44             try {
45                 ThreadStateWaitingDemo.LOCK.wait();
46             } catch (InterruptedException e) {
47                 e.printStackTrace();
48             }
49         }
50         System.out.println("线程:" + Thread.currentThread().getName() +
51                 "被唤醒执行结束,等待主线程输出状态.");
52     }
53 }

4.4.状态:TIMED_WAITING

通过该案例,演示线程的TIMED_WAITING状态。

 1 package com.anan.thread.threadstate;
 2
 3 import java.util.concurrent.TimeUnit;
 4
 5 /**
 6  * 演示线程状态:TIMED_WAITING
 7  */
 8 public class ThreadStateTimedWaitingDemo {
 9
10     public static void main(String[] args) throws InterruptedException{
11
12         // 创建线程对象
13         Runnable r1 = new MyRunnable2();
14         String tName_1 = "my-thread-1";
15         Thread t1 = new Thread(r1,tName_1);
16
17         // 启动线程,休眠1秒后,获取线程状态
18         t1.start();
19         TimeUnit.SECONDS.sleep(1);
20         System.out.println("1.主线程"+ Thread.currentThread().getName() +
21                 "打印,线程:" + t1.getName() + "当前状态:" + t1.getState());
22
23     }
24 }
25
26 /**
27  * 实现Runnable接口,创建线程
28  */
29 class MyRunnable2 implements Runnable{
30
31     public void run() {
32         System.out.println("线程:" + Thread.currentThread().getName() +
33         "准备休眠3秒:TimeUnit.SECONDS.sleep(3),等待主线程输出状态.");
34         try {
35             TimeUnit.SECONDS.sleep(3);
36         } catch (InterruptedException e) {
37             e.printStackTrace();
38         }
39     }
40 }

5.讨论分享

#考考你答案:

1.你知道线程生命周期中有哪些状态吗?

1.1.在java编程语言中,线程的生命周期总共有6种状态

2.你知道各种状态对应的含义吗?

2.1.分别是:

新建:NEW

可运行:RUNNABLE

已终止:TERMINATED

阻塞:BLOCKED

等待:WAITING

计时等待:TIMED_WAITING

原文地址:https://www.cnblogs.com/itall/p/12268060.html

时间: 2024-08-13 13:24:25

线程八大基础核心四(线程生命周期)的相关文章

线程八大基础核心一(创建线程的方式)

1.引子 在java多线程并发编程中,有八大基础核心.考考你:看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全 今天我们从第一个基础核心开始:创建线程的方式 2.考考你 #考考你: 你知道在java编程语言中,有几种创建线程的方式吗? #参考如下:网友说法.官方文档 网友说法: 官方文档说法: #说法比较: 在网络上,关于创建线程的方式.主流的说法有四种:继承Threa

线程八大基础核心二(启动线程)

1.引子 在java多线程并发编程中,有八大基础核心.考考你:看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全 今天我们从第二个基础核心开始:启动线程 2.考考你 #前情回顾: 1.在java编程语言中,创建好线程对象后,通过调用start方法,启动线程 Thread t1 = new Thread(); t1.start(); #考考你: 1.问题一:可以调用两次st

线程八大基础核心五(线程相关方法一)

1.引子 在java多线程并发编程中,有八大基础核心.考考你:看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全 今天我们从第五个基础核心开始:线程相关方法 2.考考你 #前情回顾1.在java编程语言中,与线程相关的方法主要有: 1.1.Object.wait/Object.notify/Object/notifyAll 1.2.Thread.sleep/Thread.

线程八大基础核心六(线程属性)

1.引子 在java多线程并发编程中,有八大基础核心.考考你: 看看都有哪八大基础核心呢?它们分别是: 1.创建线程的方式 2.线程启动 3.线程停止 4.线程生命周期 5.线程相关的方法 6.线程相关的属性 7.线程异常处理 8.线程安全 今天我们从第六个基础核心开始:线程相关属性 2.考考你 #前情回顾 在我们日常多线程编程中,需要关心线程的线程优先级有: 线程Id 线程名称 是否是守护线程 线程优先级 #考考你 1.你知道线程Id的作用吗? 2.你知道线程名称的作用吗? 3.你知道什么是守

MyBatis入门——核心对象的生命周期(SqlSessionFactoryBuilder,SqlSessionFactory, SqlSession和Mapper)

二.核心对象的生命周期 从上一篇文章中,我们可以看出mybatis操作数据库主要使用了4个核心对象:SqlSessionFactoryBuilder,SqlSessionFactory, SqlSession和Mapper.那么,在软件系统中,这个几个对象的生命周期是什么样的呢?什么时候创建?什么时候销毁? 1. SqlSessionFactoryBuilder SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder(

第二十七节(多线程、线程的创建和启动、生命周期、调度、控制、同步)

线程指进程中的一个执行场景,也就是执行流程,那么进程和线程的区别是什么 1. 每个进程是一个应用程序,都有独立的内存空间 2. 同一个进程中的线程共享其进程中的内存和资源 (共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的) 什么是进程? 一个进程对应一个应用程序. 例如:在 windows 操作系统启动 Word 就表示启动了一个进程.在 java 的开发环境下启动 JVM, 就表示启动了一个进程.现代的计算机都是支持多进程的,在同一个操作系统中,可以同时启动多个进程. /* 分

项目管理【02】 | 项目管理基础-信息系统项目的生命周期模型

项目生命周期指项目从启动到收尾所经历的一系列阶段,生命周期可为管理项目提供基本框架.在本篇中,我们将着重介绍项目生命周期模型方法和典型的6种生命周期模型,区别各自的优缺点,以便在实践中灵活运用. 11.项目生命周期的模型方法有三种: (1)预测型生命周期. 预测型生命周期(也称为完全计划驱动型生命周期)是在项目生命周期的尽早时间,确定项目范围及交付此范围所需的时间和成本. 优先选择预测型生命周期的情况:充分了解拟交付的产品,有厚实的行业实践基础,或者整批一次性交付产品有利于干系人. (2)迭代和

Maven实战(四)生命周期

1. 三套生命周期     Maven拥有三套相互独立的生命周期,它们分别为clean,default和site. 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段. 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post clean.当用户调用pre-clean的时候,只有pre-clean得以执行,当用户调用clean的时候,pre-clean和clean阶段会得以顺序执行:

Vue学习系列(四)——理解生命周期和钩子

前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过实例,探究vue的生命周期. 万物皆有灵,世间万物都拥有灵魂,小到山河湖海,花草树木,蚂蚁到人类,以及所有的动植物,大到地球星空和宇宙,都拥有灵魂,可以说他们都是有生命的,只是他们的生命形态是我们人类所不能理解的存在.在生产中,生命周期通俗来讲,就是从自然中来回到自然中去的全过程,也就是从采集材料设