当前位置 博文首页 > wsc的博客:刷题【按序打印】

    wsc的博客:刷题【按序打印】

    作者:[db:作者] 时间:2021-06-23 21:21

    题目

    我们提供了一个类:

    public class Foo {
        public void first() { print("first"); }
        public void second() { print("second"); }
        public void third() { print("third"); }
    }

    ?

    三个不同的线程 A、B、C 将会共用一个 Foo 实例。

    1. 一个将会调用 first() 方法
    2. 一个将会调用 second() 方法
    3. 还有一个将会调用 third() 方法
      ——请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

    示例 1:

    1. 输入: [1,2,3]
    2. 输出: "firstsecondthird"
    3. 解释:
    4. 有三个线程会被异步启动。
    5. 输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。
    6. 正确的输出是 "firstsecondthird"。

    示例 2:

    1. 输入: [1,3,2]
    2. 输出: "firstsecondthird"
    3. 解释:
    4. 输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。
    5. 正确的输出是 "firstsecondthird"。

    提示:

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

    方法1(条件): 第一时间想到,超时

    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    class Foo {
         final Lock lock = new ReentrantLock();
          final Condition condition = lock.newCondition();
          boolean one , two ;
          public Foo() {
          }
          public void first(Runnable printFirst) throws InterruptedException {
             // printFirst.run() outputs "first". Do not change or remove this line.
              lock.lock();
              try{
                  printFirst.run();
                  one = true;
                  condition.signal();
              }finally {
                  lock.unlock();;
              }
          }
          public void second(Runnable printSecond) throws InterruptedException {
             // printSecond.run() outputs "second". Do not change or remove this line.
             lock.lock();
             try{
                while (!one){
                    condition.await();
                }
                printSecond.run();
                 condition.signal();
                 two = true;
             }finally {
                 lock.unlock();
             }
          }
          public void third(Runnable printThird) throws InterruptedException {
             // printThird.run() outputs "third". Do not change or remove this line.
              lock.lock();
              try{
                  while (!(one && two)){
                      condition.await();
                  }
                  printThird.run();
              }finally {
                  lock.unlock();
              }
          }
    }

    方法2(原子类): 我觉得最好的

    class Foo {
           AtomicInteger at = 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();
               at.incrementAndGet();
           }
           public void second(Runnable printSecond) throws InterruptedException {
               // printSecond.run() outputs "second". Do not change or remove this line.
               while (at.get() != 1) {
               }
               printSecond.run();
               at.incrementAndGet();
           }
           public void third(Runnable printThird) throws InterruptedException {
               // printThird.run() outputs "third". Do not change or remove this line.
               while (at.get() != 2) {
               }
               printThird.run();
           }
    }

    转载:?刷题【按序打印】

    题目来源

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/print-in-order
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    下一篇:没有了