先吐槽一波
今天学习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();}
}

这样就相对好一点了

算是圆了大一的遗憾

用线程加锁模拟红绿灯相关推荐

  1. Java线程同步-模拟买票

    文章首发于 2020-11-29 知乎文章:Java线程同步-模拟买票 作者:落雨湿红尘(也是我o) 01 导语 本文使用JAVA代码模拟买票场景下的业务交互,通过示例讲解线程的初始化.线程同步等ja ...

  2. pool python 传参数_Python-爬虫-多线程、线程池模拟(urllib、requests、UserAgent、超时等)...

    接着之前的MonkeyLei:Python-爬取页面内容(涉及urllib.requests.UserAgent.Json等) 继续练习下多线程,线程池模拟.. 我想这样: 1. 创建一个线程池,线程 ...

  3. WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。,ExceptionType:System.Security....

    在调用System.Security.Cryptography.ProtectedData.Protect方法来保护私密信息时,IIS可能会报以下错误:CryptographicException: ...

  4. 用python做红绿灯_Python利用Event类模拟红绿灯

    #利用Event类模拟红绿灯 import threading import time event = threading.Event() def lighter(): count = 0 event ...

  5. Java线程思想模拟电影院卖票

    需求: 某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一一个程序模拟该电影院卖票 思路:         ①定义一个类SellTicket实现Runnable接口, 里面定义 ...

  6. 进程线程003 模拟线程切换

    文章目录 示例代码 关键结构体 调度链表 初始化线程堆栈 线程切换 被动切换 主动切换 线程调度 总结 之前我们已经了解过线程的等待链表和调度链表,为了更好的学习Windows的线程切换,我们要先读一 ...

  7. Java线程死锁模拟

    本文由广州疯狂软件java培训分享: 1,关于死锁的理解 死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况. 2,模拟死锁 背景介绍:我们创建一 ...

  8. api windows 线程加锁_Windows 进程与线程管理

    第六章 进程与线程管理 本章我们把注意力集中到Windows 的进程.线程与作业对象上.正如我们在前面的章节中所述的,Windows的设计以基于对象的思想作为基础.在本章的第一节中,主要介绍进程与线程 ...

  9. 【LeetCode-多线程】1279. 红绿灯路口

    目录 一.题目 二.解决 1.synchronized 2.CAS 3.Lock 4.信号量 三.参考 一.题目 这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 ...

最新文章

  1. 4g内存 mysql_4G内存 mysql数据库
  2. 网众无盘服务器 快车挂盘失败 显示 当前磁盘已经为超级工作站模式,网众无盘超级工作站的一些经验总结...
  3. Android 多屏显示分析
  4. Eigen(1)配置VS2015
  5. socket通信简介
  6. python安装到桌面的路径是什么_Python 获取windows桌面路径的5种方法小结
  7. 又一家知名社交电商平台倒下:并购重组失败,将启动破产清算或重整
  8. linux卸载zabbix数据库,结合宝塔linux面板 centos6 7一键zabbix安装脚本!
  9. 直面 Jira,Worktile CTO 为何自信满满?
  10. learning ddr DLL-off mode
  11. 正定矩阵(Positive Definite Matrices)、半正定矩阵(Positive Semidefinite Matrices)
  12. 初学者入门——NOI题库1.2
  13. win10系统计算机物理地址,win10系统查看网卡的物理地址的操作方法
  14. as常用固定搭配_英语常用固定搭配
  15. 三维提取等值面的重建方法Marching Cubes
  16. [硬件]_ELVE_VS2015下opencv3.3的配置问题
  17. Android Studio 插件-Android Styler 的使用 (转)
  18. 服务器网卡信息BIOS中设置,bios设置如何关闭网卡
  19. UnsatisfiedDependencyException: Error creating bean with name ‘personRecordServiceImpl‘:...
  20. 明星志愿3入门经典教程

热门文章

  1. VPS定时任务没有按时执行的问题
  2. springboot实现微信小程序二维码生成
  3. 微信文章排版技巧和相关排版工具
  4. 判断无向图G是否是一颗树
  5. [宋史学习] 三省六部制的破坏与宋初的中央政府机构
  6. 多层介质中广义反射系数与广义透射系数的计算与编程思路
  7. DPCA 密度峰值聚类记录
  8. 进制转换的算法及进制在线转换器
  9. 网络工程师必备技术汇总
  10. Linux如何查看显卡版本