题目如下:
1). 有多个线程,一个线程为生产者,其他线程为消费者;
2). 生产者生产商品,未消费的商品达到 20 件时就休息,小于 20 件时就继续生产;
3). 消费者消费商品,当没有可消费的商品时就休息,有可消费的商品时就继续消费;
4). 主入口函数 main 的输入参数有 3 个,分别为:消费者线程个数,生产速度(件/秒),消费速度
(件/秒)。例如消费者线程个数为 2,生产速度为 8(即每 125 ms 生产 1 件商品),消费速度为 3(即
每 1000/3 ms 消费 1 件商品)。
代码如下:
public class Test {
private static int queueSize = 20;
private static ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(queueSize); //阻塞队列不用手动进行暂停唤醒线程
public static void main(String[] args) throws InterruptedException {
Test.start(10,8,3);
}
public static void start(int i,int product,int consume) throws InterruptedException {
Producer producer = new Producer(product);
producer.start(); //启动消费者线程
Thread.sleep(10000); //停顿10秒让生产者生产,当超过20就不生产
for(int j = 1 ;j < i;j++){
Consumer consumer = new Consumer("消费者"+j,consume);
consumer.start();
}
}
//消费者
static class Consumer extends Thread{
String name;
int consumer; //消费速度
Consumer(String name,int consumer){
this.name = name;
this.consumer = consumer;
}
@Override
public void run() {
consume();
}
private void consume() {
consumer = 1000 / consumer;
while(true){
try {
sleep(consumer);
queue.take();
System.out.println(name+"从队列取走一个元素,产品剩余个数:"+queue.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//生产者
static class Producer extends Thread{
int product; //生产速度
Producer(int product){
this.product = product;
}
@Override
public void run() {
produce();
}
private void produce() {
product = 1000 / product;
while(true){
try {
sleep(product);
queue.put(1);
System.out.println("生产者向队列取中插入一个元素,"+"生产商品总个数:"+queue.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
结果如下:
先生产20个再让消费者开始消费