关键词:
在java多线程并发编程中,有八大基础核心。考考你:
看看都有哪八大基础核心呢?它们分别是:
1.创建线程的方式
2.线程启动
3.线程停止
4.线程生命周期
5.线程相关的方法
6.线程相关的属性
7.线程异常处理
8.线程安全
今天我们从第四个基础核心开始:线程生命周期
#前情回顾:
在java编程语言中,从线程创建,到线程执行结束,会经过一系列状态的转化,称为线程的生命周期
#考考你:
1.你知道线程生命周期中有哪些状态吗?
2.你知道各种状态对应的含义吗?
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
通过该案例,演示线程的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
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
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
#考考你答案:
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)。注意:不能... 查看详情
线程生命周期?其实就这么点东西(代码片段)
...,面试官问你能简单讲下并发编程中,你用过多线程不?你能简单讲下对线程的生命周期么?线程的生命周期?其实就这点点东西。线程生命周期线程的生命周期,就是指线程从创建到销毁的整个过程。就... 查看详情
线程生命周期?其实就这么点东西(代码片段)
...,面试官问你能简单讲下并发编程中,你用过多线程不?你能简单讲下对线程的生命周期么?线程的生命周期?其实就这点点东西。线程生命周期线程的生命周期,就是指线程从创建到销毁的整个过程。就... 查看详情