编写一个队列,生产者生产消息(消息内容是1,2,3,…,n),消费者消费消息,并将消息打印到控制台。
要求:
1.生产者以每秒10个的速率生产消息,队列满了后阻塞等待;
2.队列长度为100;
3.消费者以每秒1个的速率消费消息;
生产者和消费者在不同的线程;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class Producer implements Runnable {
private final BlockingQueue<Integer> queue;
public Producer(BlockingQueue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for (int i = 1; i <= 1000; i++) {
synchronized (this) {
while (i > queue.remainingCapacity()) {
wait();
}
}
queue.put(i);
System.out.println("Produced: " + i);
Thread.sleep(100); // 生产者以每秒10个的速率生产消息
notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable {
private final BlockingQueue<Integer> queue;
public Consumer(BlockingQueue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
while (true) {
Integer i = queue.take();
System.out.println("Consumed: " + i);
Thread.sleep(1000); // 消费者以每秒1个的速率消费消息
notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(100); // 队列长度为100
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start(); // 启动生产者线程
new Thread(consumer).start(); // 启动消费者线程
}
}