目录
一、前言
在分布式与并行计算课程中,生产者-消费者模式是一种经典的线程间通信机制。本实验旨在
通过该模式体验多线程编程,并探索不同线程数对程序性能的影响。
二、任务目标
- 使用一个生产者线程生成 1000000 个大于20亿的随机数。
- 使用消费者线程判断这些随机数是否为素数。
- 记录不同线程数量下程序的运行时间,对比性能。
实分为三个部分:
- 实验一:1 个生产者,1 个消费者。
- 实验二:1 个生产者,2 个消费者。
- 实验三:2 个生产者,4 个消费者。
三、技术方案
使用Java实现生产者-消费者模式
- 生产者类:生成大于 20亿 的随机数。[生产者类负责生成大整数,并且将它们放入缓冲区]
- 消费者类:判断是否为素数。[消费者类从缓冲区中提取数字,并判断其是否为素数,最终统计素数的数量]
- 缓冲区类:使用 BlockingQueue 类实现。[使用阻塞队列来充当生产者与消费者的共享缓冲区,保证线程安全。采用 LinkedBlockingQueue 作为队列的具体实现]
- 主类·:负责启动生产者和消费者线程,记录程序运行时间,并通过特殊“终止信号”通知消费者停止运行。
- 特殊终止信号:在生产者结束生产时,向缓冲区中插入一个特殊的标志(如-1),消费者在接收到该标志后推出循环,从而避免死循环问题。
四、代码实现
1.生产者类代码
import java.util.Random;
public class Producer implements Runnable {
private final Buffer buffer;
private final int totalNumbers;
public Producer(Buffer buffer, int totalNumbers) {
this.buffer = buffer;
this.totalNumbers = totalNumbers;
}
@Override
public void run() {
Random random = new Random();
try {
for