序
本文主要记录一下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来进行条件控制
小结
因为这里要循环多次打印,因而选择了ReentrantLock的condition来进行条件控制
doc
- print-foobar-alternately