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

我们提供的服务有:成都做网站、成都网站建设、成都外贸网站建设、微信公众号开发、网站优化、网站认证、闵行ssl等。为上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的闵行网站制作公司
题目
我们提供一个类:
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问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
本文题目:leetcode多线程之如何解决交替打印FooBar问题
分享网址:http://www.jxjierui.cn/article/ggigog.html


咨询
建站咨询
