力扣多线程练习----交替打印FooBar---打印零与奇偶数
交替打印FooBar---打印零与奇偶数
- 题目
- Semaphore
- 代码
- Lock公平锁
- 打印零与奇偶数
- 题目
- 代码
题目
两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。
请设计修改程序,以确保 “foobar” 被输出 n 次。
Semaphore
代码
import java.util.concurrent.Semaphore;public class FooBar {private int n;public FooBar(int n) {this.n = n;}Semaphore semaphoreFoo=new Semaphore(1);Semaphore semaphoreBar=new Semaphore(0);public void foo(Runnable printFoo) throws InterruptedException {for (int i = 0; i < n; i++) {semaphoreFoo.acquire();printFoo.run();semaphoreBar.release();}}public void bar(Runnable printBar) throws InterruptedException {for (int i = 0; i < n; i++) {semaphoreBar.acquire();printBar.run();semaphoreFoo.release();}}public static void main(String[] args) throws InterruptedException {FooBar fooBar=new FooBar(10);new Thread(()->{try {fooBar.foo(new PrintFoo());} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(()->{try {fooBar.bar(new PrintFar());} catch (InterruptedException e) {e.printStackTrace();}}).start();}}
class PrintFoo implements Runnable{@Overridepublic void run() {System.out.print("foo");}
}
class PrintFar implements Runnable{@Overridepublic void run() {System.out.print("bar");}
}
Lock公平锁
public class FooBar {private int n;public FooBar(int n) {this.n = n;}Lock lock=new ReentrantLock(true);static volatile boolean flag=true;public void foo(Runnable printFoo) throws InterruptedException {for (int i = 0; i < n; ) {lock.lock();try {if(flag){printFoo.run();i++;flag=false;}}finally {lock.unlock();}}}public void bar(Runnable printBar) throws InterruptedException {for (int i = 0; i < n; ) {lock.lock();try {if(!flag){printBar.run();i++;flag=true;}}finally {lock.unlock();}}}public static void main(String[] args) throws InterruptedException {FooBar fooBar=new FooBar(10);new Thread(()->{try {fooBar.foo(new PrintFoo());} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(()->{try {fooBar.bar(new PrintFar());} catch (InterruptedException e) {e.printStackTrace();}}).start();}}
class PrintFoo implements Runnable{@Overridepublic void run() {System.out.print("foo");}
}
class PrintFar implements Runnable{@Overridepublic void run() {System.out.print("bar");}
}
打印零与奇偶数
题目
代码
public class ZeroEvenOdd {private int n;public ZeroEvenOdd(int n) {this.n = n;}Semaphore zeros=new Semaphore(1);Semaphore odds=new Semaphore(0);Semaphore evens=new Semaphore(0);//线程 A 将调用 zero(),它只输出 0 。//线程 B 将调用 even(),它只输出偶数。//线程 C 将调用 odd(),它只输出奇数。// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {int i=0;while(i<n){zeros.acquire();printNumber.accept(0);if((i+2)%2==0){odds.release();}else{evens.release();}i++;}}//打印偶数public void even(IntConsumer printNumber) throws InterruptedException {int i=0;while(i<n/2){evens.acquire();printNumber.accept(i*2+2);i++;zeros.release();}}//打印奇数public void odd(IntConsumer printNumber) throws InterruptedException {int i=0;while(i<(n+1)/2){odds.acquire();printNumber.accept(i*2+1);i++;zeros.release();}}public static void main(String[] args) {ZeroEvenOdd zeroEvenOdd = new ZeroEvenOdd(5);new Thread(()->{try {zeroEvenOdd.zero(value -> {System.out.print(value);});} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(()->{try {zeroEvenOdd.even(value -> {System.out.print(value);});} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(()->{try {zeroEvenOdd.odd(value -> {System.out.print(value);});} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}
力扣多线程练习----交替打印FooBar---打印零与奇偶数相关推荐
- LeetCode 多线程 1116. 打印零与奇偶数
1116. 打印零与奇偶数 Ideas 有几个线程就用几个信号量,最先开始的信号量初始化为1,其它初始化为0,然后根据条件判断实现同步. 多线程的问题好多都是:锁自己,解锁别人. Code from ...
- JUC练习代码-力扣多线程1126题目:哲学家进餐,解题详解
想起来上学的时候好像就挺经典的一道算法题,一直没有自己试过去解决.刚好力扣上有这道题,于是试试看. 题目描述就简单说了.5个哲学家5只筷子,要保证每个哲学家都能吃上饭.. 哲学家从 0 到 4 按 顺 ...
- (多线程)leetcode1116. 打印零与奇偶数
假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } // 构造函数 public void zero(pr ...
- LeetCode 1116. 打印零与奇偶数
假设有这么一个类: class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero(printNumber) ...
- LeetCode之打印零与奇偶数golang与java实现
1.题目 2.java锁思路 对于java可以采用一个锁和三个Condition来实现,用一个标志标识要打印0,不打印0时,zeroCondition await.然后用一个数字记录当前要打印的数,当 ...
- 循环打印FooBar
力扣多线程测试题-循环打印FooBar 此博客为力扣多线程测试题,针对各答案进行解析补充知识点,可先自测:原测试题链接 需求: 两个不同的线程将会共用一个 FooBar 实例: 线程 A 将会调用 f ...
- 力扣编程题-解法汇总
一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...
- LeetCode 多线程 1115. 交替打印FooBar
1115. 交替打印FooBar Ideas 交替锁的设计,两把锁,foo执行的时候把foo lock acquire,print完了只有把bar lock release,这样foo就得等着,然后b ...
- leet-code 两个线程交替打印FooBar
文章目录 一.题目 二.原理解析 三.完整代码 四.代码优化 五.Java版实现 一.题目 交替打印FooBar 两个不同的线程将会共用一个 FooBar 实例.其中一个线程将会调用foo()方法,另 ...
- 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java
<LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...
最新文章
- 隐藏探针显示php版本号,修改版雅黑PHP探针 支持PHP7+(v0.4.7.2)
- 云环境上如何使用tensorboard
- 第一个Struts2程序
- Flask框架(flask中设置响应信息的方法,返回json数据的方法)
- C++使用linked list(链表)实现circular queue(循环队列)(附完整源码)
- ie8一下解决圆角,阴影不兼容问题
- javascript --- 瀑布流的实现
- C#中字段、属性、只读、构造函数赋值、反射赋值的相关
- Win10 不火不行!Edge 无缝兼容 Chrome扩展
- IOS开发学习笔记033-UIScrollView
- 【Amaple教程】4. 组件
- linux远程拷贝快捷键远程,linux命令scp远程拷贝
- python常用运维脚本实例-经典!Python运维中常用的几十个Python运维脚本
- java的swing案例
- 手动修改dns服务器设置,【当贝市场】怎样手动设置DNS服务器?教程如下
- 向NCBI上传16S rDNA数据的操作详解
- Nvidia最新三维重建技术Instant-ngp初探
- xxl-job任务调度平台
- xls和xlsx的区别
- 360 os3.0 android7.1,【360 N6】360OS安卓7.1系统V3.0.070付费纯净版ROOT刷机包
热门文章
- 计算机视觉论文-2021-07-26
- echarts 折线图
- java 画折线图_jfreechart画折线图的方法
- 51单片机——八段数码管
- 杀毒软件可以查杀所有计算机病毒吗,杀毒软件可以查杀所有病毒吗
- Convex optimization 1 --- convex set
- 第二章 复杂的HTML解析(上)
- [ICPC USA]Faulty Robot
- 更改MyEclipse/Eclipse的工作空间名字(workspace)
- Vue2 Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db