Day16-Java进阶-线程通信线程生命周期线程池单例设计模式

1. 线程通信

1.1 线程通信介绍

1.2 两条线程通信

package com.itheima.correspondence;public class CorrespondenceDemo1 {/*两条线程通信*/public static void main(String[] args) {Printer1 p = new Printer1();new Thread(new Runnable() {@Overridepublic void run() {synchronized (Printer1.class) {while (true) {try {p.print1();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (Printer1.class) {while (true) {try {p.print2();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();}}class Printer1 {int flag = 1;public void print1() throws InterruptedException {if (flag!=1){// 等待线程2Printer1.class.wait();}System.out.print("传");System.out.print("智");System.out.print("教");System.out.print("育");System.out.println();flag = 2;// 唤醒线程2Printer1.class.notify();}public void print2() throws InterruptedException {if (flag != 2) {// 等待线程1Printer1.class.wait();}System.out.print("黑");System.out.print("马");System.out.print("程");System.out.print("序");System.out.print("员");System.out.println();flag = 1;// 唤醒线程1Printer1.class.notify();}
}

1.3 三条线程通信

对于三条线程通信, 使用notifyAll(), 唤醒所有进程以避免死锁

package com.itheima.correspondence;public class CorrespondenceDemo2 {/*三条线程通信问题: sleep方法和wait方法的区别?回答:sleep方法是线程休眠, 时间到了自动醒来, sleep方法在休眠的时候, 不会释放锁.wait方法是线程等待, 需要由其它线程进行notify唤醒, wait方法在等待期间, 会释放锁.*/public static void  main(String[] args) {Printer2 p = new Printer2();new Thread(new Runnable() {@Overridepublic void run() {synchronized (Printer2.class) {while (true) {try {p.print1();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (Printer2.class) {while (true) {try {p.print2();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (Printer2.class) {while (true) {try {p.print3();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();}
}class Printer2 {int flag = 1;public void print1() throws InterruptedException {if (flag != 1) {Printer2.class.wait();}System.out.print("传");System.out.print("智");System.out.print("教");System.out.print("育");System.out.println();flag = 2;Printer2.class.notifyAll();}public void print2() throws InterruptedException {if (flag != 2) {Printer2.class.wait();}System.out.print("黑");System.out.print("马");System.out.print("程");System.out.print("序");System.out.print("员");System.out.println();flag = 3;Printer2.class.notifyAll();}public void print3() throws InterruptedException {if (flag != 3) {Printer2.class.wait();}System.out.print("传");System.out.print("智");System.out.print("大");System.out.print("学");System.out.println();flag = 1;Printer2.class.notifyAll();}
}

1.4 三条线程通信的优化

package com.itheima.correspondence;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class CorrespondenceDemo3 {/*三条线程通信 - 优化:将同步信号synchronized换成ReentrantLock*/public static void main(String[] args) {Printer3 p = new Printer3();new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {p.print1();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {p.print2();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {p.print3();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}
}class Printer3 {ReentrantLock lock = new ReentrantLock();Condition c1 = lock.newCondition();Condition c2 = lock.newCondition();Condition c3 = lock.newCondition();int flag = 1;public void print1() throws InterruptedException {// 上锁lock.lock();if (flag != 1){// 线程1等待, c1绑定线程1c1.await();}System.out.print("传");System.out.print("智");System.out.print("教");System.out.print("育");System.out.println();flag = 2;c2.signal();// 解锁lock.unlock();}public void print2() throws InterruptedException {lock.lock();if (flag != 2){// 线程2等待, c2绑定线程2c2.await();}System.out.print("黑");System.out.print("马");System.out.print("程");System.out.print("序");System.out.print("员");System.out.println();flag = 3;c3.signal();lock.unlock();}public void print3() throws InterruptedException {lock.lock();if (flag != 3){// 线程3等待, c3绑定线程3c3.await();}System.out.print("传");System.out.print("智");System.out.print("大");System.out.print("学");System.out.println();flag = 1;c1.signal();lock.unlock();}
}

1.5 案例-生产消费模式

package com.itheima.producer_consumer;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class WareHouse {/*** 缓冲区域*/public static boolean mark = false;public static ReentrantLock lock = new ReentrantLock();public static Condition producer = lock.newCondition();public static Condition consumer = lock.newCondition();}
package com.itheima.producer_consumer;public class Producer implements Runnable {/*生产者*/@Overridepublic void run() {while (true) {WareHouse.lock.lock();if (WareHouse.mark){try {WareHouse.producer.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("生产者线程生产了包子...");WareHouse.mark = true;WareHouse.consumer.signal();WareHouse.lock.unlock();}}
}
package com.itheima.producer_consumer;public class Consumer implements Runnable{/*消费者*/@Overridepublic void run() {while (true) {WareHouse.lock.lock();if (!WareHouse.mark){try {WareHouse.consumer.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("消费者吃了包子...");WareHouse.mark = false;WareHouse.producer.signal();WareHouse.lock.unlock();}}
}
package com.itheima.producer_consumer;public class Test {/*测试类*/public static void main(String[] args) {new Thread(new Producer()).start();new Thread(new Consumer()).start();}
}

2. 线程生命周期

注: 面试时最好能画出来

3. 线程池

~见Day15最后一节

4. 单例设计

4.1 单例设计-饿汉式

package com.itheima.single_design;public class SingleDesignDemo1 {/*单例设计模式 - 饿汉式(推荐使用, 简单不复杂)-----------------------------------------------------------------class Single1 {private Single1() {}public static final Single1 s = new Single1();}-----------------------------------------------------------------*/public static void main(String[] args) {Single1 s = Single1.getInstance();System.out.println(s);}
}class Single1 {private Single1() {}private static Single1 s = new Single1();public static Single1 getInstance() {return s;}
}

4.2 单例-懒汉式(延迟加载模式)

package com.itheima.single_design;public class SingleDesignDemo2 {/*单例设计模式 - 懒汉式 (延迟加载模式) --- 面试时可能会问到--------------------------------------------------class Single2 {private Single2() {}private static Single2 s;public static Single2 getInstance() {if (s == null) {s = new Single2();}return s;}}弊端: 在多线程并发操作的时候, 有可能创建出多个对象.--------------------------------------------------class Single2 {private Single2() {}private static Single2 s;public static Single2 getInstance() {synchronized (Single2.class) {if (s == null) {s = new Single2();}}return s;}}弊端: 效率非常低--------------------------------------------------*/public static void main(String[] args) {for (int i = 1; i <= 10; i++) {new Thread(new Runnable() {@Overridepublic void run() {Single2 s = Single2.getInstance();System.out.println(s);}}).start();}}
}class Single2 {private Single2() {}private static Single2 s;public static Single2 getInstance() {// 线程2// 线程1// 此处第一个 if (s == null) 用于提高效率, 避免线程多次重复阻塞, 影响效率if (s == null) {synchronized (Single2.class) {// 第二个 if (s == null) 避免产生不同的线程if (s == null) {s = new Single2();}}}return s;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【亲测有用】idea2024.1中前进后退按钮图标添加

idea更新后&#xff0c;前进后退按钮消失了&#xff0c;现在说下怎么设置 具体操作如下&#xff1a; 1、选择 File / Settings(windows版)&#xff0c;或者Preferences(mac版) 2、打开 Appearance & Behavior 并选择 Menus and Toolbars 3、选择右侧的 “Main toolbar lef…

Python中pyside2出现的pyside2 qt platform plugin could be in错误及其解决方法

系统平台&#xff1a;Win10 64bit python版本&#xff1a; python 3.8 使用pip install pyside2安装 pyside2 这是找不到QT平台的插件&#xff0c;这是环境变量QT_QPA_PLATFORM_PLUGIN_PATH出现错误 具体解决方法&#xff1a; 我们可以在每一段程序开始之前设定环境变量&…

虚幻引擎5 Gameplay框架(一)

GamePlay概论与打包和批处理脚本 GamePlay简介与创建项目 GamePlay框架&#xff1a;用于设计游戏规则&#xff0c;组织和管理游戏核心逻辑、规则以及交互的一套结构化体系。 Default Pawn Class&#xff1a;定义角色行为逻辑&#xff0c;接收玩家控制器的输入&#xff0c;一般…

【R语言】组合图:散点图+箱线图+平滑曲线图+柱状图

用算数运算符轻松组合不同的ggplot图&#xff0c;如图&#xff1a; 具体代码如下&#xff1a; install.packages("devtools")#安装devtools包 devtools::install_github("thomasp85/patchwork")#安装patchwork包 library(ggplot2) library(patchwork) #p1是…

[ACTF2020 新生赛]Upload--BUUCTF

题&#xff1a; 第一步&#xff1a;上传php文件&#xff0c;他提示&#xff0c;只能上传jpg、png、gif 第二步&#xff1a;使用bp抓上传jpg文件的包&#xff0c;在修改文件后缀名为phtml 修改前 修改后 第三步&#xff1a;进行放过&#xff0c;在访问浏览器 得到&#xff1a;U…

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP&#xff08;地址解析协议&#xff09;RARP&#xff08;反向地址解析协议&#xff09;ICMP&#xff08;互联网控制消息协议&#xff09; 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务&#xff08;不可靠&#xff0c;尽最大努力&#xff0c…

线性代数基础1向量

1、向量是什么 1.1、向量的定义 在数学中&#xff0c;向量&#xff08;也称为欧几里得向量、几何向量、矢量&#xff09;&#xff0c;指具有大小和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1a;代表向量的…

Rust腐蚀服务器定制地图开服

Rust腐蚀服务器定制地图开服 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀这个游戏有很多的插件mod作者&#xff0c;在地图制作这一块也是一样&#xff0c;有些好玩的地图可能大家在map网站找到了但是不知道怎么操作设置那么今天艾西给大家说下特定定制地图怎么弄。…

嬴图| ISO/IEC-GQL国际图语言标准发布,图技术开启新纪元

GQL作为继SQL之后的第二个数据库查询语言国际标准&#xff0c;近日正式发布。这标志着图技术开启新纪元——图时代即将到来&#xff01; 同时&#xff0c;这也预示着将有越来越多的组织采用“图”来解决各种复杂问题&#xff0c;更意味着SQL系统与负载将逐渐转向GQL&#xff0…

2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版 最新SSL证书在线申请系统源码 | 支持API接口 SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL…

Ubuntu20.04安装 mysql8.0.32

检查删除原有的mysql(可以不做&#xff0c;自己记录) 1、 下载 MySQL :: Download MySQL Community Server (Archived Versions) wget https://cdn.mysql.com/archives/mysql-8.0/mysql-server_8.0.32-1ubuntu20.04_amd64.deb-bundle.tar 2、解压到指定目录下 tar xvf mysq…

GDPU Java 天码行空9

&#xff08;一&#xff09;实验目的 1、掌握JAVA中异常类型及其特点&#xff1b; 2、重点掌握异常的处理方法&#xff1b; 3、能创建自定义异常处理方法&#xff1b; 4、掌握文件操作方法。 &#xff08;二&#xff09;实验内容和步骤 1、try catch finally 如果catch里面有…

vue封装请求、合并js、合并多个js

vue封装请求、合并js、合并多个js 作为一个后端开发&#xff0c;写前端时发现&#xff0c;每次导入api接口都会有一堆代码&#xff0c;像下面这样&#xff1a; import {footprintList, footprintDelete} from /api/userApi.js import {addressList} from /api/userApi.js impor…

PHP定期给自己网站目录做个特征镜像供快速对比

效果图 上代码&#xff1a; <style> h1{font-size:24px;line-height:180%;font-weight:600;margin:1px 2px;color:#0180cf;} h2{font-size:20px;line-height:140%;font-weight:600;margin:2px 4px;color:green;} h3{font-size:16px;line-height:140%;font-weight:600;m…

如何把视频中的画面保存为图片?免费的工具不用白不用

在数字化时代&#xff0c;截取视频中的珍贵瞬间成为了人们创作、分享和保存回忆的重要方式。 那么&#xff0c;如何迅速捕捉视频中的精彩画面&#xff0c;留存美好瞬间呢&#xff1f;有人说直接截图就可以&#xff0c;如果直接截图就可以&#xff0c;小编就不用写这篇文章了&a…

《深入浅出.NET框架设计与实现》笔记2——C#源码从编写到执行的流程

中间语言&#xff08;Intermediate Language&#xff0c;IL&#xff09; C#编译器在编译时&#xff0c;会将源代码作为输入&#xff0c;并以中间语言形式输入出&#xff0c;该代码保存在*.exe文件中或*.dll文件中。 公共语言运行时&#xff08;CLR&#xff09; 可以将IL代码…

26版SPSS操作教程(高级教程第十三章)

前言 #今日世界读书日&#xff0c;宝子你&#xff0c;读书了嘛~ #本期内容&#xff1a;主成分分析、因子分析、多维偏好分析 #由于导师最近布置了学习SPSS这款软件的任务&#xff0c;因此想来平台和大家一起交流下学习经验&#xff0c;这期推送内容接上一次高级教程第十二章…

STM32cubemx和HAL库的使用入门--点亮一颗LED

一&#xff1a;流程介绍 &#xff08;1&#xff09;环境搭建 1 &#xff1a;stm32cubemx安装 2 &#xff1a;stm32xxFW安装 3 &#xff1a;MDK5安装 4 &#xff1a;生成MDK版本project &#xff08;2&#xff09;stm32cubemx创建工程&#xff0c;选择芯片型…

WAF防范原理

目录 一、什么是WAF 二、纵深安全防御 WAF的组网模式 WAF配置全景 WAF端 服务器 攻击端 拦截SQL注入&#xff0c;XSS攻击&#xff0c;木马文件上传 要求&#xff1a; 使用WAF&#xff0c;通过配置策略要求能防御常见的web漏洞攻击&#xff08;要求至少能够防御SQL、XSS、文…

云原生:10分钟了解一下Kubernetes架构

Kubernetes&#xff0c;作为当今容器编排技术的事实标准&#xff0c;以其强大的功能和灵活的架构设计&#xff0c;在全球范围内得到了广泛的应用和认可。本文将深入简出地探讨Kubernetes的核心架构&#xff0c;帮助大家了解Kubernetes&#xff0c;为今后的高效的学习打下良好的…