小编给大家分享一下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来进行条件控制
以上是“leetcode多线程之如何解决交替打印FooBar问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/go4it/blog/4550623