日常记录——leetcode-按序打印

    技术2022-07-10  136

    题目:我们提供了一个类:

    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 { volatile boolean secondFlag = false; volatile boolean thirdFlag = false; public Foo() { } public void first(Runnable printFirst) throws InterruptedException { // printFirst.run() outputs "first". Do not change or remove this line. printFirst.run(); secondFlag = true; } public void second(Runnable printSecond) throws InterruptedException { // printSecond.run() outputs "second". Do not change or remove this line. while(!secondFlag){} printSecond.run(); thirdFlag = true; } public void third(Runnable printThird) throws InterruptedException { // printThird.run() outputs "third". Do not change or remove this line. while(!thirdFlag){} printThird.run(); } }

    执行结果: 优化后:

    class Foo { AtomicInteger flag = new AtomicInteger(0); public Foo() { } public void first(Runnable printFirst) throws InterruptedException { // printFirst.run() outputs "first". Do not change or remove this line. printFirst.run(); flag.incrementAndGet(); } public void second(Runnable printSecond) throws InterruptedException { // printSecond.run() outputs "second". Do not change or remove this line. while(1 != flag.get()){} printSecond.run(); flag.incrementAndGet(); } public void third(Runnable printThird) throws InterruptedException { // printThird.run() outputs "third". Do not change or remove this line. while(2 != flag.get()){} printThird.run(); } }

    LeetCode执行结果:

    Processed: 0.011, SQL: 9