交替打印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---打印零与奇偶数相关推荐

  1. LeetCode 多线程 1116. 打印零与奇偶数

    1116. 打印零与奇偶数 Ideas 有几个线程就用几个信号量,最先开始的信号量初始化为1,其它初始化为0,然后根据条件判断实现同步. 多线程的问题好多都是:锁自己,解锁别人. Code from ...

  2. JUC练习代码-力扣多线程1126题目:哲学家进餐,解题详解

    想起来上学的时候好像就挺经典的一道算法题,一直没有自己试过去解决.刚好力扣上有这道题,于是试试看. 题目描述就简单说了.5个哲学家5只筷子,要保证每个哲学家都能吃上饭.. 哲学家从 0 到 4 按 顺 ...

  3. (多线程)leetcode1116. 打印零与奇偶数

    假设有这么一个类: class ZeroEvenOdd {   public ZeroEvenOdd(int n) { ... }      // 构造函数   public void zero(pr ...

  4. LeetCode 1116. 打印零与奇偶数

    假设有这么一个类: class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero(printNumber) ...

  5. LeetCode之打印零与奇偶数golang与java实现

    1.题目 2.java锁思路 对于java可以采用一个锁和三个Condition来实现,用一个标志标识要打印0,不打印0时,zeroCondition await.然后用一个数字记录当前要打印的数,当 ...

  6. 循环打印FooBar

    力扣多线程测试题-循环打印FooBar 此博客为力扣多线程测试题,针对各答案进行解析补充知识点,可先自测:原测试题链接 需求: 两个不同的线程将会共用一个 FooBar 实例: 线程 A 将会调用 f ...

  7. 力扣编程题-解法汇总

    一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...

  8. LeetCode 多线程 1115. 交替打印FooBar

    1115. 交替打印FooBar Ideas 交替锁的设计,两把锁,foo执行的时候把foo lock acquire,print完了只有把bar lock release,这样foo就得等着,然后b ...

  9. leet-code 两个线程交替打印FooBar

    文章目录 一.题目 二.原理解析 三.完整代码 四.代码优化 五.Java版实现 一.题目 交替打印FooBar 两个不同的线程将会共用一个 FooBar 实例.其中一个线程将会调用foo()方法,另 ...

  10. 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java

    <LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...

最新文章

  1. 隐藏探针显示php版本号,修改版雅黑PHP探针 支持PHP7+(v0.4.7.2)
  2. 云环境上如何使用tensorboard
  3. 第一个Struts2程序
  4. Flask框架(flask中设置响应信息的方法,返回json数据的方法)
  5. C++使用linked list(链表)实现circular queue(循环队列)(附完整源码)
  6. ie8一下解决圆角,阴影不兼容问题
  7. javascript --- 瀑布流的实现
  8. C#中字段、属性、只读、构造函数赋值、反射赋值的相关
  9. Win10 不火不行!Edge 无缝兼容 Chrome扩展
  10. IOS开发学习笔记033-UIScrollView
  11. 【Amaple教程】4. 组件
  12. linux远程拷贝快捷键远程,linux命令scp远程拷贝
  13. python常用运维脚本实例-经典!Python运维中常用的几十个Python运维脚本
  14. java的swing案例
  15. 手动修改dns服务器设置,【当贝市场】怎样手动设置DNS服务器?教程如下
  16. 向NCBI上传16S rDNA数据的操作详解
  17. Nvidia最新三维重建技术Instant-ngp初探
  18. xxl-job任务调度平台
  19. xls和xlsx的区别
  20. 360 os3.0 android7.1,【360 N6】360OS安卓7.1系统V3.0.070付费纯净版ROOT刷机包

热门文章

  1. 计算机视觉论文-2021-07-26
  2. echarts 折线图
  3. java 画折线图_jfreechart画折线图的方法
  4. 51单片机——八段数码管
  5. 杀毒软件可以查杀所有计算机病毒吗,杀毒软件可以查杀所有病毒吗
  6. Convex optimization 1 --- convex set
  7. 第二章 复杂的HTML解析(上)
  8. [ICPC USA]Faulty Robot
  9. 更改MyEclipse/Eclipse的工作空间名字(workspace)
  10. Vue2 Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db