【发布时间】:2020-07-08 02:06:19
【问题描述】:
我正在通过此链接解决 LeetCode 问题:https://leetcode.com/problems/fizz-buzz-multithreaded/。
基本上,我正在编写一个执行标准 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,但我不知道该怎么做。显然,我的 main 方法在某个时候停止运行,因为所有线程都进入等待状态并且没有人唤醒它们(这里缺少 t4)。
任何帮助将不胜感激!
【问题讨论】:
标签: java multithreading thread-safety