題目描述
相關標簽
相關企業
給你一個類:
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 次。
示例 1:
輸入:n = 1
輸出:“foobar”
解釋:這里有兩個線程被異步啟動。其中一個調用 foo() 方法, 另一個調用 bar() 方法,“foobar” 將被輸出一次。
示例 2:
輸入:n = 2
輸出:“foobarfoobar”
解釋:“foobar” 將被輸出兩次。
提示:
1 <= n <= 1000
解題思路
可以使用同步信號量的奇偶來來實現交替打印
代碼實現
class FooBar {private int n;private volatile int s = 0;public FooBar(int n) {this.n = n;}public void foo(Runnable printFoo) throws InterruptedException {for (int i = 0; i < n; i++) {while (s%2!=0) {}printFoo.run();s+=1;}}public void bar(Runnable printBar) throws InterruptedException {for (int i = 0; i < n; i++) {while (s%2==0) {}// printBar.run() outputs "bar". Do not change or remove this line.printBar.run();s+=1;}}
}
測試方法
public static void main(String[] args) throws InterruptedException {FooBar foo = new FooBar(3);ExecutorService executorService = Executors.newFixedThreadPool(3);executorService.submit(() -> {try {foo.foo(() -> System.out.print("foo"));} catch (InterruptedException e) {e.printStackTrace();}});executorService.submit(()->{try {foo.bar(()->System.out.print("bar"));}catch (InterruptedException e) {e.printStackTrace();}});//匿名內部類寫法//lambda表達式寫法executorService.shutdown();}