Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode刷题1115交替打印 FooBar
前文
本文为leetcode多线程类型题目,题目序号为1115,主要考察对于多线程知识的应用。
题目信息
给你一个类:
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 实例:
线程 A 将会调用 foo() 方法,而 线程 B 将会调用 bar() 方法 请设计修改程序,以确保 "foobar" 被输出 n 次。
解题思路
通过阅读题目可知,本题主要是考察关于多线程知识的应用,尤其针对在对线程运用过程中,对于各线程执行顺序的相关知识考察。想要让两个线程进行交替执行,很容易想到的是进行一次限制,当一个线程执行完毕后,才允许下一个线程执行,同时该线程进入等待状态。因此很容易想到采用CountDownLatch关键字进行线程控制。当线程执行时先对于关键字进行判断。得到执行权后再对于关键字进行释放,允许另一线程执行,以此类推得到最终的解题方案。
解题代码
public class FooBar {
private int n;
CountDownLatch countDownLatch1 = new CountDownLatch(1);
CountDownLatch countDownLatch2 = new CountDownLatch(1);
public FooBar(int n) {
this.n = n;
}
public void foo(Runnable printFoo) throws InterruptedException{
for (int i = 0; i < n; i++) {
// printFoo.run() outputs "foo". Do not change or remove this line.
if(i > 0){
countDownLatch1.await();
countDownLatch1 = new CountDownLatch(1);
}
printFoo.run();
countDownLatch2.countDown();
}
}
public void bar(Runnable printBar) throws InterruptedException{
for (int i = 0; i < n; i++) {
countDownLatch2.await();
countDownLatch2 = new CountDownLatch(1);
// printBar.run() outputs "bar". Do not change or remove this line.
printBar.run();
countDownLatch1.countDown();
}
}
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。