原題鏈接:https://leetcode.com/problems/fizz-buzz-multithreaded/
難度:medium
解題思路:多線程問題,直接上代碼了
class FizzBuzz {
private int n;
private volatile int current = 1;
public FizzBuzz(int n) {
this.n = n;
}
// printFizz.run() outputs "fizz".
public synchronized void fizz(Runnable printFizz) throws InterruptedException {
while(current <= n) {
if(this.current % 3 == 0 && this.current % 5 != 0) {
printFizz.run();
current ++;
this.notifyAll();
} else {
this.wait();
}
}
}
// printBuzz.run() outputs "buzz".
public synchronized void buzz(Runnable printBuzz) throws InterruptedException {
while(current <= n) {
if(this.current % 3 != 0 && this.current % 5 == 0) {
printBuzz.run();
current ++;
this.notifyAll();
} else {
this.wait();
}
}
}
// printFizzBuzz.run() outputs "fizzbuzz".
public synchronized void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {
while(current <= n) {
if(this.current % 15 == 0) {
printFizzBuzz.run();
current ++;
this.notifyAll();
} else {
this.wait();
}
}
}
// printNumber.accept(x) outputs "x", where x is an integer.
public synchronized void number(final IntConsumer printNumber) throws InterruptedException {
while(current <= n) {
if(this.current % 3 != 0 && this.current % 5 != 0) {
printNumber.accept(current);
this.notifyAll();
current ++;
} else {
this.wait();
}
}
}
}