千家信息网

leetcode多线程之如何解决交替打印FooBar问题

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,小编给大家分享一下leetcode多线程之如何解决交替打印FooBar问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题
千家信息网最后更新 2025年01月24日leetcode多线程之如何解决交替打印FooBar问题

小编给大家分享一下leetcode多线程之如何解决交替打印FooBar问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

题目

我们提供一个类: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 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。请设计修改程序,以确保 "foobar" 被输出 n 次。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/print-foobar-alternately著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

class FooBar {    private int n;    ReentrantLock lock = new ReentrantLock();    Condition fooCnd = lock.newCondition();    Condition barCnd = lock.newCondition();    boolean foo = true;    public FooBar(int n) {        this.n = n;    }    public void foo(Runnable printFoo) throws InterruptedException {                lock.lock();        try {            for (int i = 0; i < n; i++) {                if (!foo) {                    fooCnd.await();                }                foo = false;                    // printFoo.run() outputs "foo". Do not change or remove this line.                    printFoo.run();                barCnd.signal();            }        } finally {            lock.unlock();        }    }    public void bar(Runnable printBar) throws InterruptedException {                lock.lock();        try {            for (int i = 0; i < n; i++) {                if (foo) {                    barCnd.await();                }                foo = true;                // printBar.run() outputs "bar". Do not change or remove this line.                    printBar.run();                fooCnd.signal();            }        } finally {            lock.unlock();        }    }}
  • 这里使用ReentrantLock的condition来进行条件控制

以上是"leetcode多线程之如何解决交替打印FooBar问题"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0