春招打卡d1n02-leetcode刷题1115交替打印 FooBar

253 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题1115交替打印 FooBar

前文

本文为leetcode多线程类型题目,题目序号为1115,主要考察对于多线程知识的应用。

题目信息

给你一个类:

class FooBar { public void foo() {     for (int i = 0; i < n; i++) {       print("foo");   } }

public void bar() {     for (int i = 0; i < n; i++) {       print("bar");     } } } 两个不同的线程将会共用一个 FooBar 实例:

线程 A 将会调用 foo() 方法,而 线程 B 将会调用 bar() 方法 请设计修改程序,以确保 "foobar" 被输出 n 次。

解题思路

通过阅读题目可知,本题主要是考察关于多线程知识的应用,尤其针对在对线程运用过程中,对于各线程执行顺序的相关知识考察。想要让两个线程进行交替执行,很容易想到的是进行一次限制,当一个线程执行完毕后,才允许下一个线程执行,同时该线程进入等待状态。因此很容易想到采用CountDownLatch关键字进行线程控制。当线程执行时先对于关键字进行判断。得到执行权后再对于关键字进行释放,允许另一线程执行,以此类推得到最终的解题方案。

解题代码

public class FooBar {
    private int n;
    CountDownLatch countDownLatch1 = new CountDownLatch(1);
    CountDownLatch countDownLatch2 = new CountDownLatch(1);

    public FooBar(int n) {
        this.n = n;
    }

    public void foo(Runnable printFoo) throws InterruptedException{

        for (int i = 0; i < n; i++) {
            // printFoo.run() outputs "foo". Do not change or remove this line.
            if(i > 0){
                countDownLatch1.await();
                countDownLatch1 = new CountDownLatch(1);
            }
            printFoo.run();
            countDownLatch2.countDown();
        }
    }

    public void bar(Runnable printBar) throws InterruptedException{
        for (int i = 0; i < n; i++) {
            countDownLatch2.await();
            countDownLatch2 = new CountDownLatch(1);
            // printBar.run() outputs "bar". Do not change or remove this line.
            printBar.run();
            countDownLatch1.countDown();
        }
    }
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。