我們提供一個類:
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 次。
?
示例 1:
輸入: n = 1
輸出: "foobar"
解釋: 這里有兩個線程被異步啟動。其中一個調用 foo() 方法, 另一個調用 bar() 方法,"foobar" 將被輸出一次。
示例 2:
輸入: n = 2
輸出: "foobarfoobar"
解釋: "foobar" 將被輸出兩次。
思路:設置一個標記即可,此標記要線程安全。
記得不符合的時候要暫時讓出時間片,否則不能通過。
class FooBar {private int n;private AtomicInteger done = new AtomicInteger(0);public FooBar(int n) {this.n = n;}public void foo(Runnable printFoo) throws InterruptedException {for (int i = 0; i < n; i++) {while(done.get()!=0)Thread.yield();// printFoo.run() outputs "foo". Do not change or remove this line.printFoo.run();done.set(1);}}public void bar(Runnable printBar) throws InterruptedException {for (int i = 0; i < n; i++) {while(done.get()!=1)Thread.yield();// printBar.run() outputs "bar". Do not change or remove this line.printBar.run();done.set(0);}}
}
?