Leetcode之多线程编程题

1116. 打印零与奇偶数

现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。

  • 例如,调用 printNumber(7) 将会输出 7 到控制台。

给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zeroeven 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程:

  • 线程 A:调用 zero() ,只输出 0
  • 线程 B:调用 even() ,只输出偶数
  • 线程 C:调用 odd() ,只输出奇数

修改给出的类,以输出序列 "010203040506..." ,其中序列的长度必须为 2n 。

实现 ZeroEvenOdd 类:

  • ZeroEvenOdd(int n) 用数字 n 初始化对象,表示需要输出的数。
  • void zero(printNumber) 调用 printNumber 以输出一个 0 。
  • void even(printNumber) 调用printNumber 以输出偶数。
  • void odd(printNumber) 调用 printNumber 以输出奇数。

Semaphore

class ZeroEvenOdd {private int n;private Semaphore zeroSema = new Semaphore(1);private Semaphore oddSema = new Semaphore(0);//奇数private Semaphore evenSema = new Semaphore(0);//偶数public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {zeroSema.acquire();printNumber.accept(0);if (i % 2!= 0) {//奇数oddSema.release();} else {evenSema.release();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程evenSema.acquire();printNumber.accept(i);zeroSema.release();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2 != 0) {//奇数,打印奇数,并释放zero的线程oddSema.acquire();printNumber.accept(i);zeroSema.release();}}}
}

 synchronized

class ZeroEvenOdd {private int n;private final Object ob=new Object();private volatile int flag=0;public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {synchronized (ob){while (flag!=0){ob.wait();}printNumber.accept(0);if(i%2==0)flag=2;elseflag=1;ob.notifyAll();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程synchronized (ob){while (flag!=2){ob.wait();}printNumber.accept(i);flag=0;ob.notifyAll();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2!= 0) {//偶数 打印偶数 并释放zero的线程synchronized (ob){while (flag!=1){ob.wait();}printNumber.accept(i);flag=0;ob.notifyAll();}}}}
}

CountDownLatch

class ZeroEvenOdd {private int n;private CountDownLatch countDownLatch_zero=new CountDownLatch(0);private CountDownLatch countDownLatch_even=new CountDownLatch(1);private CountDownLatch countDownLatch_odd=new CountDownLatch(1);public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {countDownLatch_zero.await();printNumber.accept(0);countDownLatch_zero=new CountDownLatch(1);if (i % 2!= 0) {//奇数countDownLatch_odd.countDown();} else {countDownLatch_even.countDown();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程countDownLatch_even.await();printNumber.accept(i);countDownLatch_even=new CountDownLatch(1);countDownLatch_zero.countDown();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2 != 0) {//奇数,打印奇数,并释放zero的线程countDownLatch_odd.await();printNumber.accept(i);countDownLatch_odd=new CountDownLatch(1);countDownLatch_zero.countDown();}}}
}

 Lock

class ZeroEvenOdd {private int n;private volatile int flag=0;Lock lock=new ReentrantLock();Condition condition_zero = lock.newCondition();Condition conditon_even = lock.newCondition();Condition condition_odd = lock.newCondition();public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {lock.lock();try{while (flag!=0){condition_zero.await();}printNumber.accept(0);if(i%2==0) {flag = 2;conditon_even.signal();}else {flag = 1;condition_odd.signal();}}finally {lock.unlock();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程lock.lock();try {while (flag != 2) {conditon_even.await();}printNumber.accept(i);flag = 0;condition_zero.signal();}finally {lock.unlock();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2!= 0) {//偶数 打印偶数 并释放zero的线程lock.lock();try {while (flag != 1) {condition_odd.await();}printNumber.accept(i);flag = 0;condition_zero.signal();}finally {lock.unlock();}}}}
}

Thread.yield

class ZeroEvenOdd {private int n;private volatile int flag=0;public ZeroEvenOdd(int n) {this.n = n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {while (flag!=0){Thread.yield();}printNumber.accept(0);if(i%2==0)flag=2;elseflag=1;}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶数 打印偶数 并释放zero的线程while (flag!=2){Thread.yield();}printNumber.accept(i);flag=0;}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2!= 0) {//偶数 打印偶数 并释放zero的线程while (flag!=1){Thread.yield();}printNumber.accept(i);flag=0;}}}
}

1195. 交替打印字符串

编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:

  • 如果这个数字可以被 3 整除,输出 "fizz"。
  • 如果这个数字可以被 5 整除,输出 "buzz"。
  • 如果这个数字可以同时被 3 和 5 整除,输出 "fizzbuzz"。

例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz

假设有这么一个类:

class FizzBuzz {public FizzBuzz(int n) { ... }               // constructorpublic void fizz(printFizz) { ... }          // only output "fizz"public void buzz(printBuzz) { ... }          // only output "buzz"public void fizzbuzz(printFizzBuzz) { ... }  // only output "fizzbuzz"public void number(printNumber) { ... }      // only output the numbers
}

请你实现一个有四个线程的多线程版  FizzBuzz, 同一个 FizzBuzz 实例会被如下四个线程使用:

  1. 线程A将调用 fizz() 来判断是否能被 3 整除,如果可以,则输出 fizz
  2. 线程B将调用 buzz() 来判断是否能被 5 整除,如果可以,则输出 buzz
  3. 线程C将调用 fizzbuzz() 来判断是否同时能被 3 和 5 整除,如果可以,则输出 fizzbuzz
  4. 线程D将调用 number() 来实现输出既不能被 3 整除也不能被 5 整除的数字。

CyclicBarrier

class FizzBuzz {private int n;private CyclicBarrier cb = new CyclicBarrier(4);public FizzBuzz(int n) {this.n = n;}// printFizz.run() outputs "fizz".public void fizz(Runnable printFizz) throws InterruptedException, BrokenBarrierException {for (int i = 1; i <= n; i++) {if (i % 3 == 0 && i % 5 != 0) {printFizz.run();}cb.await();}}// printBuzz.run() outputs "buzz".public void buzz(Runnable printBuzz) throws InterruptedException, BrokenBarrierException {for (int i = 1; i <= n; i++) {if (i % 3 != 0 && i % 5 == 0) {printBuzz.run();}cb.await();}}// printFizzBuzz.run() outputs "fizzbuzz".public void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException, BrokenBarrierException {for (int i = 1; i <= n; i++) {if (i % 3 == 0 && i % 5 == 0) {printFizzBuzz.run();}cb.await();}}// printNumber.accept(x) outputs "x", where x is an integer.public void number(IntConsumer printNumber) throws InterruptedException, BrokenBarrierException {for (int i = 1; i <= n; i++) {if (i % 3 != 0 && i % 5 != 0) {printNumber.accept(i);}cb.await();}}
}

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

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

相关文章

物联网知识复习

物联网的内涵和体系结构 物联网的基本内涵 物联网的基本内涵在于物联&#xff0c;物物相连或者物和人相连的互联网。 也就是说&#xff0c;它是要由物主动发起的&#xff0c;物物互联的互联网。 它的第一层意思是说物和物相连&#xff1b;第二层意思是说物和人相连。 物联网的…

美摄人像背景抠图SDK

企业对于图像处理的需求越来越高。无论是社交媒体营销、产品展示还是企业内部培训&#xff0c;高质量的图像都是吸引用户和提升品牌形象的关键。然而&#xff0c;传统的图像处理工具往往需要大量的手动操作和专业技巧&#xff0c;耗时耗力。为了满足企业对于高效、精准的图像处…

古诗数据,json版本

古诗数据 项目地址 分享一个古诗数据&#xff0c;包含作者、朝代、古诗名称及古诗内容。 分为两个版本&#xff0c;第一个是纯净的故事内容&#xff0c;数据如下&#xff1a; [{"title":"下终南山过斛斯山人宿置酒","auth":"李白"…

✔ ★【备战实习(面经+项目+算法)】 10.22学习时间表(总计学习时间:4.5h)(算法刷题:7道)

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

医院数字档案系统-医院数字档案室建设方案

医院数字档案系统是一种将医院病历、检查报告、检验结果等医学相关数据以数字化形式储存、管理和检索的信息系统。它是利用计算机技术和网络技术对病历、影像、检验、处方等各类医疗信息进行数字化管理&#xff0c;实现电子病历、电子影像、电子处方等数据化服务。 医院数字档案…

Zabbix“专家坐诊”第208期问答汇总

问题一 Q&#xff1a;请问大佬们&#xff0c;我的测试机部署了2个版本的zabbix服务端&#xff0c;在启动第二个的时候报这个错&#xff0c;请问这个路径能在配置文件修改吗&#xff1f; SYJKLiLB64dded94d3c0c.png A&#xff1a;报错是你的进程存在&#xff0c;无法启动。一个…

无缝的链间互操作性:通用消息传递的强大之处

前言 通用消息传递&#xff08;General Message Passing&#xff0c;GMP&#xff09;是一种支持区块链之间通信和数据传输的机制。GMP正在成为增强不同区块链网络之间互操作性的解决方案。GMP允许应用程序构建者通过使用安全消息在区块链之间通信和交换信息来利用任何区块链的…

openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose

openEuler 使用 DNF 安装 Docker CE 1024&#xff0c;节日快乐&#xff01;回归正题&#xff0c;DNF 安装 DockerOS 系统环境准备安装 docker-ce 步骤1、更新系统2、安装必要的软件包3、添加 Docker CE 存储库4、更新索引缓存并安装 Docker CE5、启动 Docker 服务6、查看 Docke…

数字驱动,营销赋能丨工商职院电子商务专业学生,前往餐饮美食电商新业态基地试岗交流

纸上得来终觉浅&#xff0c;绝知此事要躬行。为了让学生更好的了解自己与所应聘岗位的匹配度&#xff0c;同时也希望在实际业务场景中&#xff0c;发掘自身优势&#xff0c;10月23日&#xff0c;四川产教融创园信息技术有限公司组织四川工商职业技术学院的电子商务专业学生一行…

微软成AI热潮大赢家,继续押注大模型和人工智能

KlipC报道&#xff1a;微软在官网发布了财报&#xff0c;据数据显示该公司营收同比增长13%达565亿美元&#xff0c;营业利润同比增长25%达269亿美元&#xff0c;净利润同比增长27%达223亿美元。 KlipC的合伙人Andi D表示&#xff1a;“微软的智能云部门收入同比增长19%&#xf…

新成果展示:AlGaN/GaN基紫外光电晶体管的设计与制备

紫外光电探测器被广泛应用于导弹预警、火灾探测、非可见光通信、环境监测等民事和军事领域&#xff0c;这些应用场景的实现需要器件具有高信噪比和高灵敏度。因此&#xff0c;光电探测器需要具备响应度高、响应速度快和暗电流低的特性。近期&#xff0c;天津赛米卡尔科技有限公…

NOIP2023模拟2联测23-害怕

澪有个 n n n 个点 m m m 条边的无向图&#xff0c;每条边都有蓝白两种颜色中的一种&#xff0c;保证蓝色的边形成了这个图的一个生成树。 她希望给这些边赋上边权&#xff0c;保证边权是 1 ∼ m 1 \sim m 1∼m 的排列&#xff0c;使得蓝色的边是最小生成树。 希望这些边权…

JAVA电商平台免费搭建 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网

目录 一. 在 Windows 操作系统中探测 HTTP/HTTPS 出网 1. Bitsadmin 命令 2.Certuil 命令 2.Linux系统探测HTTP/HTTPS出网 1.Curl命令 2.Wget命令 对目标服务器探测 HTTP/HTTPS 是否出网时&#xff0c;要根据目标系统类型执行命令&#xff0c;不同类型的操作系统使用的探…

接口调优:从2s到200ms的心路历程分享

hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 平常在开发过程中&#xff0c;时常会遇到一些复杂查询或复杂业务&#xff0c;导致接口出现性能问题&#xff0c;基本上每一个程序猿在工作中都离不开对接口性能的调优&#xff0c; 今天我就在这里记录一下最近在实…

angular2+ 集成系统利用服务作为模块通信中间件

模块间通信的话angular2可以使用Input() 和 Output()进行父子组件间通信 例如 父组件html <app-input-output [item]"currentItem" (deleteRequest)"crossOffItem($event)"> </app-input-output>子组件ts export class ItemDetailComponent…

【IDEA查看一个jar包的依赖】

首先install,打jar包 重新创建一个项目 选中刚才的jar包 在这个包下就能看到jar包的依赖了

ES SearchAPI----Query DSL语言

文章目录 Getting Startedmatch_all查询全部sort排序from\size分页_source指定字段 match匹配查询match_phrase短语匹配multi_match多字段匹配range范围查询bool复合查询must必须匹配&#xff0c;可贡献得分must_not必须不匹配&#xff0c;可贡献得分should可有可无&#xff0c…

AnkiPDF Guru软件评测:打开全新学习方式的大门

在当今信息爆炸的时代&#xff0c;如何高效学习和记忆成为了每个人关注的焦点。AnkiPDF Guru软件作为结合了Anki和PDF的学习利器&#xff0c;向我们展示了一种全新的学习方式。本文将以软件的实用性和使用场景为切入点&#xff0c;从专业的角度客观分析和评测该软件&#xff0c…

VB.NET 中使用SqlConnection类连接到Microsoft SQL Server数据库的详细步骤

目录 前言: 过程: 1.建立SqlConnection连接 2.打开SqlConnection连接 3.关闭SqlConnection连接 4.执行SqlCommand命令 5.传递参数 总结: 前言: VB.NET的SqlConnection是一个用于连接到SQL Server数据库的类。在VB.NET中&#xff0c;SqlConnection是一个很重要的类&…