• [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() 方法之后被执行。

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

    题解

    使用synchronzed锁+while(条件)的方式,使用线程的等待通知实现。
    second方法等待firstFinished;third方法等待secondFinished。

    代码

    class Foo {
    
        private Object obj = new Object();
        private boolean firstFinished = false;
        private boolean secondFinished = false;
    
        public Foo() {
            
        }
    
        public void first(Runnable printFirst) throws InterruptedException {
            
            // printFirst.run() outputs "first". Do not change or remove this line.
            synchronized (obj){
                printFirst.run();
                firstFinished = true;
                obj.notifyAll();
            }      
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            
            // printSecond.run() outputs "second". Do not change or remove this line.
            synchronized(obj){
                while(!firstFinished){
                    obj.wait();
                }
    
                printSecond.run();
                secondFinished = true;
                obj.notifyAll();
            }
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            
            // printThird.run() outputs "third". Do not change or remove this line.
            synchronized(obj){
                while(!secondFinished){
                    obj.wait();
                }
    
                printThird.run();
            }       
        }
    }
    
  • 相关阅读:
    Spring Boot 使用 Dev-tool 热部署
    Spring Boot 上传文件
    Spring Boot 目录文件结构
    Spring MVC 文件上传
    Spring MVC 混合使用多种视图技术
    XmlViewResolver 和 ResourceBundleViewResolver
    XML 和 Json
    Excel 和 PDF
    04-树5 Root of AVL Tree (25 分)
    04-树4 是否同一棵二叉搜索树 (25 分)
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12604397.html
Copyright © 2020-2023  润新知