当前位置: 首页 > news >正文

三线程分别打印1、2、3顺序执行10次

线程A、B、C分别打印1,2,3顺序执行10次

题目

线程A,B,C分别打印1,2,3; 并顺序执行10次;

解法一

基本思路

  1. 即根据题目意思, 要求使用三个线程分别命名为A, B, C; 并且线程A打印1, 线程B打印2, 线程C打印3, 按顺序执行10次;
  2. 可以利用 Semaphore 信号量实现, 利用 acquire() 方法, 若不满足访问共享资源条件则会令当前线程阻塞; 和 release() 方法, 释放资源, 并唤醒等待资源的线程;

实现代码

public class ThreeThreadsPrint123 {public static void main(String[] args) {// 信号量 控制访问资源的线程数量 设置线程数为0Semaphore first = new Semaphore(0);Semaphore second = new Semaphore(0);Semaphore third = new Semaphore(0);Thread t1 = new Thread(() -> {for (int i = 0; i < 10; ++ i) {try {// 线程 A 打印 1System.out.println("线程: " + Thread.currentThread().getName() + "打印: 1");// 休眠一秒 便于观察结果Thread.sleep(1000);// release 会释放信号量 并唤醒等待线程second.release();// 尝试访问资源 因为允许0个线程访问 所以会阻塞线程 Afirst.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "A");Thread t2 = new Thread(() -> {for (int i = 0; i < 10; ++ i) {try {// 先阻塞线程B 保证线程A先打印结束后 再唤醒线程Bsecond.acquire();// 线程 B 打印 2System.out.println("线程: " + Thread.currentThread().getName() + "打印: 2");// 休眠一秒 便于观察结果Thread.sleep(1000);// release 会释放信号量 并唤醒等待线程third.release();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "B");Thread t3 = new Thread(() -> {for (int i = 0; i < 10; ++ i) {try {// 先阻塞线程C 保证线程B先打印结束后 再唤醒线程Cthird.acquire();// 线程 C 打印 3System.out.println("线程: " + Thread.currentThread().getName() + "打印: 3");// 休眠一秒 便于观察结果Thread.sleep(1000);// release 会释放信号量 并唤醒等待线程first.release();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "C");t1.start();t2.start();t3.start();}}

解法二

基本思路

  1. 使用 synchronized 同步锁来实现, 使用 wait() 方法来让线程等待, 使用 notifyAll() 方法来唤醒线程

实现代码

public class ThreeThreadsPrint123_2 {// 计数器:计算当前打印次数private int count = 0;// 同步锁对象private final Object lock = new Object();// 打印方法:0打印A,1打印B,2打印Cpublic void printNum(int flag) {for (int i = 0; i < 10; ++ i) {synchronized (lock) {while (count % 3 != flag && count < 30) {try {// 若没有轮到当前线程打印 则让当前线程等待lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}if (count < 30) {System.out.println("线程: " + Thread.currentThread().getName() + " 打印: " + (1 + flag));// 次数增加++ count;// 唤醒所有线程lock.notifyAll();}}}}public static void main(String[] args) {ThreeThreadsPrint123_2 obj = new ThreeThreadsPrint123_2();Thread t1 = new Thread(() -> obj.printNum(0), "A");Thread t2 = new Thread(() -> obj.printNum(1), "B");Thread t3 = new Thread(() -> obj.printNum(2), "B");t2.start();t1.start();t3.start();}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 游戏加速器推荐 网游加速器排行榜
  • 快速将网站从HTTP升级为HTTPS
  • Git代码冲突怎么处理?
  • gptpdf深度解析:开源文档处理技术全攻略
  • AI人工智能分析王楚钦球拍被踩事件的真相
  • [Day 43] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • Linux:Xshell相关配置及前期准备
  • python-素数回文数的个数(赛氪OJ)
  • BlockingQueue简介
  • 分享c语言中一些实用的函数2
  • Unity复制对象时让私有变量也被复制的简单方法
  • 预算管理一体化系统技术标准V2.0 — 第一章-概述
  • cdn 内容分发网络
  • Cesium 高德地图暗黑化
  • LangChain(八)构建多Agent的AI系统-实战!
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • javascript从右向左截取指定位数字符的3种方法
  • Linux中的硬链接与软链接
  • Redash本地开发环境搭建
  • tweak 支持第三方库
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 动态魔术使用DBMS_SQL
  • 翻译:Hystrix - How To Use
  • 官方解决所有 npm 全局安装权限问题
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 近期前端发展计划
  • 利用jquery编写加法运算验证码
  • 爬虫模拟登陆 SegmentFault
  • 关于Android全面屏虚拟导航栏的适配总结
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #define、const、typedef的差别
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)JPA - JQPL 实现增删改查
  • (转)【Hibernate总结系列】使用举例
  • (转)C#调用WebService 基础
  • (转)c++ std::pair 与 std::make
  • (转)视频码率,帧率和分辨率的联系与区别
  • .apk文件,IIS不支持下载解决
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net CF下精确的计时器
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net6Api后台+uniapp导出Excel
  • /var/log/cvslog 太大
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [1181]linux两台服务器之间传输文件和文件夹
  • [BJDCTF2020]The mystery of ip1
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)