我正在解决来自这个链接的LeetCode问题:https://leetcode.com/problems/fizz-buzz-multithreaded/。
基本上,我正在编写一个FizzBuzz类,它实现标准的FizzBuzz,但使用4个同时运行的线程,每个线程调用不同的方法。(一个线程调用fizzbuzz,一个调用fizz,一个调用buzz,一个调用数字)。这是我的解决方案,已经被接受:
我想要用IntConsumer初始化第四个线程(这是问题中给出的),这样我就可以执行t4,但我不确定该如何做。显然,我的主方法在某个时间点停止运行,因为所有线程都进入等待状态,没有人唤醒它们(这里缺少t4)。
非常感谢任何帮助!
基本上,我正在编写一个FizzBuzz类,它实现标准的FizzBuzz,但使用4个同时运行的线程,每个线程调用不同的方法。(一个线程调用fizzbuzz,一个调用fizz,一个调用buzz,一个调用数字)。这是我的解决方案,已经被接受:
class FizzBuzz {
private int n;
int num = 1; // FizzBuzz starts at 1.
public FizzBuzz(int n) {
this.n = n;
}
// printFizz.run() outputs "fizz".
public synchronized void fizz(Runnable printFizz) throws InterruptedException {
while(num <= n) {
if(num % 3 == 0 && num % 5 != 0) {
printFizz.run();
num++;
notifyAll();
} else {
wait();
}
}
}
// printBuzz.run() outputs "buzz".
public synchronized void buzz(Runnable printBuzz) throws InterruptedException {
while(num <= n) {
if(num % 3 != 0 && num % 5 == 0) {
printBuzz.run();
num++;
notifyAll();
} else {
wait();
}
}
}
// printFizzBuzz.run() outputs "fizzbuzz".
public synchronized void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {
while(num <= n) {
if(num % 15 == 0) {
printFizzBuzz.run();
num++;
notifyAll();
} else {
wait();
}
}
}
// printNumber.accept(x) outputs "x", where x is an integer.
public synchronized void number(IntConsumer printNumber) throws InterruptedException {
while(num <= n) {
if(num % 3 != 0 && num % 5 != 0) {
printNumber.accept(num);
num++;
notifyAll();
} else {
wait();
}
}
}
}
我的问题是我在IDE中模拟这种情况时遇到了困难。
这是我的主方法:
public class FizzBuzzMain {
public static void main(String[] args) {
FizzBuzz fizzBuzz = new FizzBuzz(15);
Runnable printFizzBuzz = new PrintFizzBuzz();
Runnable printFizz = new PrintFizz();
Runnable printBuzz = new PrintBuzz();
Thread t1 = new Thread(printFizzBuzz);
Thread t2 = new Thread(printFizz);
Thread t3 = new Thread(printBuzz);
IntConsumer printNumber = new PrintNumber();
t1.start();
t2.start();
t3.start();
try {
fizzBuzz.number(printNumber);
fizzBuzz.fizz(printFizz);
fizzBuzz.buzz(printBuzz);
fizzBuzz.buzz(printFizzBuzz);
} catch(Exception e) {
e.printStackTrace();
}
}
}
我想要用IntConsumer初始化第四个线程(这是问题中给出的),这样我就可以执行t4,但我不确定该如何做。显然,我的主方法在某个时间点停止运行,因为所有线程都进入等待状态,没有人唤醒它们(这里缺少t4)。
非常感谢任何帮助!