小编给大家分享一下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();
}
}
}
以上是“leetcode多线程之如何解决交替打印FooBar问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注天达云行业资讯频道!