序
本文主要記錄一下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