用线程加锁模拟红绿灯
先吐槽一波
今天学习lock的时候突然想起来
大一学Java的时候有个题叫
用线程加锁模拟红绿灯
当时感觉挺傻的
红绿灯是按顺序执行的
为什么开三个线程让他们抢占cpu
现在想想可能老师的目的是让我们练习线程间的通讯的吧(强力帮老师圆回来)
当时要求用 synchronized 写
package com.nwk.sync;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/**** 线程间的定制话通线*/
//第一步 创建资源类
class ShareResource {//定义标志位private int flag = 1; // 1 AA 2 BB 3 CCpublic synchronized void print25() {try {//判断while(flag != 1) {//等待this.wait();}//干活System.out.println("红灯亮");Thread.sleep(2500);System.out.println("红灯灭");//通知flag = 2; //修改标志位 2} catch (InterruptedException e) {e.printStackTrace();}this.notifyAll();}public synchronized void print15() {try {while(flag != 2) {this.wait();}System.out.println("绿灯亮");Thread.sleep(1500);System.out.println("绿灯灭");;//修改标志位flag = 3;//通知CC线程this.notifyAll();} catch (InterruptedException e) {e.printStackTrace();}finally {}}public synchronized void print3() {try {while(flag != 3) {this.wait();}System.out.println("黄灯亮");Thread.sleep(300);System.out.println("黄灯灭");//修改标志位flag = 1;//通知AA线程this.notifyAll();} catch (InterruptedException e) {e.printStackTrace();}finally {}}
}public class hld1{public static void main(String[] args) {ShareResource shareResource = new ShareResource();new Thread(()->{while(true){shareResource.print25();}},"AA").start();new Thread(()->{while(true) {shareResource.print15();}},"BB").start();new Thread(()->{while(true){shareResource.print3();}},"CC").start();}
}
个人感觉 用 synchronized 写比较傻 因为
他通知其他线程时只能通知全部 或者随机一个
不能定向通知
可以用ReentrantLock
package com.nwk.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/**** 线程间的定制话通线*/
//第一步 创建资源类
class ShareResource {//定义标志位private int flag = 1; // 1 AA 2 BB 3 CC//创建Lock锁private Lock lock = new ReentrantLock();//创建三个conditionprivate Condition c1 = lock.newCondition();private Condition c2 = lock.newCondition();private Condition c3 = lock.newCondition();public void print25() throws InterruptedException {//上锁lock.lock();try {//判断while(flag != 1) {//等待c1.await();}//干活System.out.println("红灯亮");Thread.sleep(2500);System.out.println("红灯灭");//通知flag = 2; //修改标志位 2c2.signal(); //通知BB线程}finally {//释放锁lock.unlock();}}public void print15() throws InterruptedException {lock.lock();try {while(flag != 2) {c2.await();}System.out.println("绿灯亮");Thread.sleep(1500);System.out.println("绿灯灭");;//修改标志位flag = 3;//通知CC线程c3.signal();}finally {lock.unlock();}}public void print3() throws InterruptedException {lock.lock();try {while(flag != 3) {c3.await();}System.out.println("黄灯亮");Thread.sleep(300);System.out.println("黄灯灭");//修改标志位flag = 1;//通知AA线程c1.signal();}finally {lock.unlock();}}
}public class hld{public static void main(String[] args) {ShareResource shareResource = new ShareResource();new Thread(()->{while(true){try {shareResource.print25();} catch (InterruptedException e) {e.printStackTrace();}}},"AA").start();new Thread(()->{while(true) {try {shareResource.print15();} catch (InterruptedException e) {e.printStackTrace();}}},"BB").start();new Thread(()->{while(true){try {shareResource.print3();} catch (InterruptedException e) {e.printStackTrace();}}},"CC").start();}
}
这样就相对好一点了
算是圆了大一的遗憾
用线程加锁模拟红绿灯相关推荐
- Java线程同步-模拟买票
文章首发于 2020-11-29 知乎文章:Java线程同步-模拟买票 作者:落雨湿红尘(也是我o) 01 导语 本文使用JAVA代码模拟买票场景下的业务交互,通过示例讲解线程的初始化.线程同步等ja ...
- pool python 传参数_Python-爬虫-多线程、线程池模拟(urllib、requests、UserAgent、超时等)...
接着之前的MonkeyLei:Python-爬取页面内容(涉及urllib.requests.UserAgent.Json等) 继续练习下多线程,线程池模拟.. 我想这样: 1. 创建一个线程池,线程 ...
- WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。,ExceptionType:System.Security....
在调用System.Security.Cryptography.ProtectedData.Protect方法来保护私密信息时,IIS可能会报以下错误:CryptographicException: ...
- 用python做红绿灯_Python利用Event类模拟红绿灯
#利用Event类模拟红绿灯 import threading import time event = threading.Event() def lighter(): count = 0 event ...
- Java线程思想模拟电影院卖票
需求: 某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一一个程序模拟该电影院卖票 思路: ①定义一个类SellTicket实现Runnable接口, 里面定义 ...
- 进程线程003 模拟线程切换
文章目录 示例代码 关键结构体 调度链表 初始化线程堆栈 线程切换 被动切换 主动切换 线程调度 总结 之前我们已经了解过线程的等待链表和调度链表,为了更好的学习Windows的线程切换,我们要先读一 ...
- Java线程死锁模拟
本文由广州疯狂软件java培训分享: 1,关于死锁的理解 死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况. 2,模拟死锁 背景介绍:我们创建一 ...
- api windows 线程加锁_Windows 进程与线程管理
第六章 进程与线程管理 本章我们把注意力集中到Windows 的进程.线程与作业对象上.正如我们在前面的章节中所述的,Windows的设计以基于对象的思想作为基础.在本章的第一节中,主要介绍进程与线程 ...
- 【LeetCode-多线程】1279. 红绿灯路口
目录 一.题目 二.解决 1.synchronized 2.CAS 3.Lock 4.信号量 三.参考 一.题目 这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 ...
最新文章
- 4g内存 mysql_4G内存 mysql数据库
- 网众无盘服务器 快车挂盘失败 显示 当前磁盘已经为超级工作站模式,网众无盘超级工作站的一些经验总结...
- Android 多屏显示分析
- Eigen(1)配置VS2015
- socket通信简介
- python安装到桌面的路径是什么_Python 获取windows桌面路径的5种方法小结
- 又一家知名社交电商平台倒下:并购重组失败,将启动破产清算或重整
- linux卸载zabbix数据库,结合宝塔linux面板 centos6 7一键zabbix安装脚本!
- 直面 Jira,Worktile CTO 为何自信满满?
- learning ddr DLL-off mode
- 正定矩阵(Positive Definite Matrices)、半正定矩阵(Positive Semidefinite Matrices)
- 初学者入门——NOI题库1.2
- win10系统计算机物理地址,win10系统查看网卡的物理地址的操作方法
- as常用固定搭配_英语常用固定搭配
- 三维提取等值面的重建方法Marching Cubes
- [硬件]_ELVE_VS2015下opencv3.3的配置问题
- Android Studio 插件-Android Styler 的使用 (转)
- 服务器网卡信息BIOS中设置,bios设置如何关闭网卡
- UnsatisfiedDependencyException: Error creating bean with name ‘personRecordServiceImpl‘:...
- 明星志愿3入门经典教程