线程八大基础核心四(线程生命周期)(代码片段)

itall itall     2023-04-21     681

关键词:

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

 

线程八大基础核心六(线程属性)(代码片段)

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

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

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

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

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

2.线程的八大核心基础知识之启动线程的正确和错误方式(代码片段)

....start()和run()的比较1.代码演示分析:调用run方法则是由主线程执行的调用start方法则是由新创建的线程执行的/***对比start和run两种启动线程的方式*/publicclassStartAndRunMethodpublicstaticvoidmain(String[]args)//1.直接调用run方法Runnablerunnable=()-... 查看详情

3.线程的八大核心基础知识之如何正确停止线程(代码片段)

...interrupt来通知,而不是强制解释:由于我们无法强行停止线程,只是告诉线程需要停止了,线程才可能进行收尾清理最后停止,也可能停止不了。控制权不在我们手中。三.最佳实践:如何正确停止线程 1.正确的停止方法:int... 查看详情

java多线程基础--线程生命周期与线程协作详解(代码片段)

前言各位亲爱的读者朋友,我正在创作Java多线程系列文章,本篇我们将梳理基础内容:线程生命周期与线程协作这是非常基础的内容,本篇仅从知识完整性角度出发,做一次梳理。作者按:本篇按照自己... 查看详情

java多线程基础--线程生命周期与线程协作详解(代码片段)

前言各位亲爱的读者朋友,我正在创作Java多线程系列文章,本篇我们将梳理基础内容:线程生命周期与线程协作这是非常基础的内容,本篇仅从知识完整性角度出发,做一次梳理。作者按:本篇按照自己... 查看详情

高并发多线程之线程基础中生命周期线程封闭cpu缓存(代码片段)

前言本篇文章主要介绍线程的基础,什么是线程、线程的状态、线程封闭、cpu缓存和内存屏障、指令重排等概念什么是java线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程... 查看详情

1,线程基础(代码片段)

一,线程与进程线程进程中负责程序执行的执行单元,线程本身依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。进程执行中的程序,一个进程至少包含一个线程。二,线程的生命周期线程是... 查看详情

这么理解线程生命周期,是不是很简单?(代码片段)

...,本文同样收录在此,觉得不错,还请Star??为什么要了解线程的生命周期?之前写过SpringBean生命周期三部曲:SpringBean生命周期之缘起SpringBean生命周期之缘尽SpringAware到底是什么?有朋友留言说:“了解了它们的生命周期后,使... 查看详情

一个java线程生命周期,我竟然可以扯半小时(代码片段)

...学们加油!面试官:你不是精通Java并发吗?从基础的Java线程生命周期开始讲讲吧。好的,面试官。吧啦啦啦...如果要说Java线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期因为JVM是跑在操作系统上面的嘛,所... 查看详情

线程生命周期(代码片段)

线程生命周期线程状态转换线程状态新建(new)创建线程。Threadt=newMyThread();就绪(runnable)线程处于可随时被cpu调度状态。执行start()启动线程。运行(running)线程被cpu调度,持续运行。调用yield()可让出cpu资源(不一定生效)。... 查看详情

5.线程的八大核心基础知识之thread和object类中的重要方法详解(代码片段)

...阻塞阶段、唤醒阶段、遇到中断wait作用是释放锁,当前线程进入等待,notify和notifyAll作用是通知等待线程可以执行wait,notify,notifyAll都必须放到同步代码块中(1)wait和notify基本用法展示:首先thread1线程拿到object对象锁住object后... 查看详情

第18题-线程生命周期(代码片段)

文章目录第18题-线程生命周期1.线程状态2.创建(New)3.就绪(Runnable)4.运行(Running)5.阻塞(Blocked)5.1等待阻塞5.2同步阻塞5.3其他阻塞第18题-线程生命周期1.线程状态创建就绪运行阻塞死亡2.创建(New)[!NOTE]新创建了一个... 查看详情

第18题-线程生命周期(代码片段)

文章目录第18题-线程生命周期1.线程状态2.创建(New)3.就绪(Runnable)4.运行(Running)5.阻塞(Blocked)5.1等待阻塞5.2同步阻塞5.3其他阻塞第18题-线程生命周期1.线程状态创建就绪运行阻塞死亡2.创建(New)[!NOTE]新创建了一个... 查看详情

线程的生命周期以及控制线程(代码片段)

一、线程的生命周期线程状态转换图:1、新建状态用newkeyword和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。注意:不能... 查看详情

线程生命周期?其实就这么点东西(代码片段)

...,面试官问你能简单讲下并发编程中,你用过多线程不?你能简单讲下对线程的生命周期么?线程的生命周期?其实就这点点东西。线程生命周期线程的生命周期,就是指线程从创建到销毁的整个过程。就... 查看详情

线程生命周期?其实就这么点东西(代码片段)

...,面试官问你能简单讲下并发编程中,你用过多线程不?你能简单讲下对线程的生命周期么?线程的生命周期?其实就这点点东西。线程生命周期线程的生命周期,就是指线程从创建到销毁的整个过程。就... 查看详情