交替打印字符串
难度:
标签:
题目描述
代码结果
运行时间: 26 ms, 内存: 16.6 MB
/*
思路: 使用Java Stream的方式, 对1到n的整数进行遍历, 判断每个数字是否能被3、5或3和5同时整除,
并使用相应的输出方法来打印对应的字符串或数字。
*/
import java.util.stream.IntStream;
public class FizzBuzzStream {
public static void fizzBuzz(int n) {
IntStream.rangeClosed(1, n).forEach(i -> {
if (i % 3 == 0 && i % 5 == 0) {
System.out.println("fizzbuzz");
} else if (i % 3 == 0) {
System.out.println("fizz");
} else if (i % 5 == 0) {
System.out.println("buzz");
} else {
System.out.println(i);
}
});
}
}
解释
方法:
这个题解使用了四个线程来并发处理从1到n的数字,每个线程根据数字的特性(能否被3、5整除)来执行特定的打印任务。利用锁(Lock)和条件变量(Condition)来同步不同的线程,确保在任意时刻只有一个线程能够执行并修改共享资源current的值。每个方法(fizz, buzz, fizzbuzz, number)对应一个线程,它们在内部循环中检查当前数字(self.current)是否符合打印条件,如果符合则打印并通知其他线程,否则等待其他线程的通知。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在FizzBuzz类中,如何确保在多个线程中同时只有一个线程能够修改`self.current`值?
▷🦆
为什么每个条件检查后都要调用`self.cv.notify_all()`而不是`self.cv.notify()`?
▷🦆
如果数字n非常大,这种多线程方法相比单线程有什么明显的性能提升吗?
▷🦆
在多线程环境下,`self.cv.wait()`会如何影响程序的效率和线程的调度?
▷