天天看點

java多線程交替列印abc,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來進行條件控制

小結

因為這裡要循環多次列印,因而選擇了ReentrantLock的condition來進行條件控制

doc