Java并发编程之线程状态实例分析
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
千家信息网最后更新 2025年01月21日Java并发编程之线程状态实例分析
今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
线程状态概述
线程由生到死的完整过程:
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State
这个枚举中给出了六种线程状态:
线程状态 | 导致状态发生条件 |
---|---|
NEW(新建) | 线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread只有线程对象,没有线程特征。 |
Runnable(可运行) | 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。调用了t.start()方法 :就绪(经典教法) |
Blocked(锁阻塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。 |
Waiting(无限等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。 |
Timed Waiting(计时等待) | 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。 |
Teminated(被终止) | 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。 |
睡眠sleep方法
状态中有一个状态叫做计时等待,可以通过Thread类的方法来进行演示。 public static void sleep(long time)
让当前线程进入到睡眠状态,到毫秒后自动醒来继续执行
//主线程执行到sleep方法会休眠1秒后再继续执行public class Test{ public static void main(String[] args){ for(int i = 1;i<=5;i++){ Thread.sleep(1000); System.out.println(i) } }}
等待和唤醒
public void wait()
: 让当前线程进入到等待状态 此方法必须锁对象调用。
public class Demo1_wait { public static void main(String[] args) throws InterruptedException { // 步骤1 : 子线程开启,进入无限等待状态, 没有被唤醒,无法继续运行. new Thread(() -> { try { System.out.println("begin wait ...."); synchronized ("") { "".wait(); } System.out.println("over"); } catch (Exception e) { } }).start(); }
public void notify()
: 唤醒当前锁对象上等待状态的线程 此方法必须锁对象调用。
public class Demo2_notify { public static void main(String[] args) throws InterruptedException { // 步骤1 : 子线程开启,进入无限等待状态, 没有被唤醒,无法继续运行. new Thread(() -> { try { System.out.println("begin wait ...."); synchronized ("") { "".wait(); } System.out.println("over"); } catch (Exception e) { } }).start(); //步骤2: 加入如下代码后, 3秒后,会执行notify方法, 唤醒wait中线程. Thread.sleep(3000); new Thread(() -> { try { synchronized ("") { System.out.println("唤醒"); "".notify(); } } catch (Exception e) { } }).start(); }}
等待唤醒的一个小例子
定义一个集合,包子铺线程完成生产包子,包子添加到集合中;吃货线程完成购买包子,包子从集合中移除。
当包子没有时(包子状态为false),吃货线程等待.
包子铺线程生产包子(即包子状态为true),并通知吃货线程(解除吃货的等待状态)
public class BaoZiPu extends Thread{ private Listlist ; public BaoZiPu(String name,ArrayList list){ super(name); this.list = list; } @Override public void run() { int i = 0; while(true){ //list作为锁对象 synchronized (list){ if(list.size()>0){ //存元素的线程进入到等待状态 try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果线程没进入到等待状态 说明集合中没有元素 //向集合中添加元素 list.add("包子"+i++); System.out.println(list); //集合中已经有元素了 唤醒获取元素的线程 list.notify(); } } } }}
public class ChiHuo extends Thread { private Listlist ; public ChiHuo(String name,ArrayList list){ super(name); this.list = list; } @Override public void run() { //为了能看到效果 写个死循环 while(true){ //由于使用的同一个集合 list作为锁对象 synchronized (list){ //如果集合中没有元素 获取元素的线程进入到等待状态 if(list.size()==0){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果集合中有元素 则获取元素的线程获取元素(删除) list.remove(0); //打印集合 集合中没有元素了 System.out.println(list); //集合中已经没有元素 则唤醒添加元素的线程 向集合中添加元素 list.notify(); } } } }}
public class Demo { public static void main(String[] args) { //等待唤醒案例 List<String> list = new ArrayList<>(); // 创建线程对象 BaoZiPu bzp = new BaoZiPu("包子铺",list); ChiHuo ch = new ChiHuo("吃货",list); // 开启线程 bzp.start(); ch.start(); }}
以上就是"Java并发编程之线程状态实例分析"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
线程
状态
元素
包子
方法
对象
吃货
运行
知识
篇文章
包子铺
步骤
实例
实例分析
分析
编程
代码
内容
参数
此方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
北京环球合一网络技术
北京浪潮服务器虚拟化部署服务器
gaea服务器管理系统
管理网络安全工作的部门
汉滨区互联网科技发展有限公司
csgo 添加服务器
有哪些数据库可以查英文文献
科密消费机连接数据库失败
自己买服务器
多可文档管理服务器
医院终端软件开发
网络安全和信息化重要意义
网安小兵网络安全
广电网络安全施工协议
紫金桥实时数据库
九江网络安全管理公司
聊城工务段网络安全
上海悦易网络技术
如何填写163邮箱服务器
超鬼王服务器打不开
网络安全m是什么意思
吴江区品牌网络技术优势
郭康荣网络安全
2b2t服务器有什么装备
java数据库连接池存活时长
软件开发中途离职走人
网易用的谁家的服务器
乌镇的互联网小镇科技馆项目
网络安全与技术知识点
数据库偷取小宠类型