LeetCode_1114

我们提供了一个类:

public class Foo {
public void one() { print("one"); }
public void two() { print("two"); }
public void three() { print("three"); }
}
三个不同的线程将会共用一个 Foo 实例。

线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,
three() 方法在 two() 方法之后被执行。

示例 1:

输入: [1,2,3]
输出: "onetwothree"
解释:
有三个线程会被异步启动。
输入 [1,2,3] 表示线程 A 将会调用 one() 方法,
线程 B 将会调用 two() 方法,线程 C 将会调用 three() 方法。
正确的输出是 "onetwothree"。

示例 2:

输入: [1,3,2]
输出: "onetwothree"
解释:
输入 [1,3,2] 表示线程 A 将会调用 one() 方法,
线程 B 将会调用 three() 方法,线程 C 将会调用 two() 方法。
正确的输出是 "onetwothree"。

注意:

尽管输入中的数字似乎暗示了顺序,
但是我们并不保证线程在操作系统中的调度顺序。
你看到的输入格式主要是为了确保测试的全面性。

示例代码:

class Foo {

    public Foo() {

    }

    public void first(Runnable printFirst) throws InterruptedException {

        // printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
} public void second(Runnable printSecond) throws InterruptedException { // printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
} public void third(Runnable printThird) throws InterruptedException { // printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
}
}

方法一:使用锁题解

  • 测试用例:36个
  • 执行用时:17ms
  • 内存消耗:35.8MB
class Foo {

    // 构造两道屏障
private boolean firstFinished;
private boolean secondFinished;
private Object lock = new Object(); public Foo() { } public void first(Runnable printFirst) throws InterruptedException { synchronized (lock) {
// printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
firstFinished = true;
lock.notifyAll();
}
} public void second(Runnable printSecond) throws InterruptedException { synchronized (lock) {
while (!firstFinished) {
lock.wait();
}
// printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
secondFinished = true;
lock.notifyAll();
}
} public void third(Runnable printThird) throws InterruptedException { synchronized (lock) {
while (!secondFinished) {
lock.wait();
}
// printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
}
}
}

方法二:通过信号量题解

  • 测试用例:36个
  • 执行用时:19ms
  • 内存消耗:36.1MB
import java.util.concurrent.Semaphore;

class Foo {

    Semaphore A;
Semaphore B;
Semaphore C; public Foo() {
A = new Semaphore(1);
B = new Semaphore(0);
C = new Semaphore(0);
} public void first(Runnable printFirst) throws InterruptedException { A.acquire();
// printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
B.release();
} public void second(Runnable printSecond) throws InterruptedException { B.acquire();
// printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
C.release();
} public void third(Runnable printThird) throws InterruptedException { C.acquire();
// printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
}
}

方法三:使用 CountDownLatch 题解

  • 测试用例:36个
  • 执行用时:19ms
  • 内存消耗:36MB
import java.util.concurrent.CountDownLatch;

class Foo {

    CountDownLatch latch1;
CountDownLatch latch2; public Foo() {
latch1 = new CountDownLatch(1);
latch2 = new CountDownLatch(2);
} public void first(Runnable printFirst) throws InterruptedException { // printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
latch1.countDown();
latch2.countDown();
} public void second(Runnable printSecond) throws InterruptedException { latch1.await();
// printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
latch2.countDown();
} public void third(Runnable printThird) throws InterruptedException { latch2.await();
// printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
}
}

LeetCode_1114.按顺序打印(多线程)的更多相关文章

  1. Condition实现多线程顺序打印

    Condition实现多线程顺序打印: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.R ...

  2. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  3. 剑指offer系列34----按之字形顺序打印二叉树

    [题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...

  4. 剑指Offer-按之字形顺序打印二叉树

    package Tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** * ...

  5. Algorithm --> 顺序打印矩阵

    顺序打印矩阵 思路 参考代码 #include <iostream> using namespace std; ], int row, int col) { || col < ) r ...

  6. 剑指offer——python【第59题】按之子形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 这道题其实是分层打印二叉树的进阶版 ...

  7. 剑指Offer 59. 按之字形顺序打印二叉树 (二叉树)

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目地址 https://www.nowco ...

  8. 剑指Offer-- 之字形顺序打印二叉树

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val ...

  9. 剑指offer(59)按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目分析 这道题还是需要画图分析,不然不好找 ...

随机推荐

  1. python处理json文件(Yelp数据集)

    python脚本处理yelp数据集 import sys import json import re import os import time if __name__ == '__main__': ...

  2. 服务器配置好但Idea/Datagrip无法连接远程数据库的解决方案

    服务器没有开放端口3306,在云服务控制台配置安全组即可.

  3. 14.AutoMapper 之依赖注入(Dependency Injection)

    https://www.jianshu.com/p/f66447282780   依赖注入(Dependency Injection) AutoMapper支持使用静态服务定位构建自定义值解析器和自定 ...

  4. Oracle及SQLPLUS使用笔记

    Oracle及SQLPLUS使用笔记 自己之前粗粗的学过MySQL,学校用的是Oracle,学生使用sqlplus,这是个命令行界面的数据库管理软件(为了学习嘛,不用图形化可以理解),这里记录一些使用 ...

  5. type=file 上传图片限制 类型和尺寸 方法

    <form> <input type="file" name="pic" id="pic" accept="im ...

  6. JDK1.8+API+中文文档+高清完整版(不要积分 免费拿)

    JDK1.8+API+中文文档+高清完整版+CHM帮助文档 链接: https://pan.baidu.com/s/1LbdWSZ4qFjWXdJ88bXkn5w 提取码: frew 希望能帮上大家的 ...

  7. IE6兼容笔记

    1.IE6中,元素右浮动的时候前面不能有文本或内联元素,否则会换行独占一行 解决办法:将浮动元素放到文本或内联元素前面,大都在制作新闻列表的时候会遇到这种问题. 未完,待续!

  8. Java加载Class文件的原理机制

    详见:http://blog.sina.com.cn/s/blog_6cbfd2170100ljmp.html 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器 ...

  9. Xshell6,亲测可用~破解版简单解压免安装~已更新官方版本安装方法

    下面的内容别看了,使用这个最新的安装官方版本 https://www.cnblogs.com/taopanfeng/p/11671727.html 下面的内容别看了,使用这个最新的安装官方版本 htt ...

  10. python常见问题解决方案

    平时工作中经常需要用到这些python小技巧,顺便做个记录 import requests import time def get_pr(domain): pr = 6 time.sleep(1) h ...