Java实现简易生产者消费者模型
1.首先我们要知道什么是生产者消费者模型
生产者消费者模型是一种多线程设计模式,用于解决生产者线程和消费者线程之间的协调问题。
在生产者消费者模型中,生产者线程生成数据并将其加入队列,而消费者线程从队列中获取数据并进行消费。在生产者和消费者之间存在一个共享的缓冲区,它作为生产者和消费者之间的中间存储点,用于协调生产者和消费者的工作。
当生产者线程生成的数据太多时,它将被阻塞,直到消费者线程消费了一些数据,使队列不再满。当队列不满时,生产者线程才开始生产数据。反之,当队列为空时,消费者线程将阻塞,直到生产者线程生成了数据,消费者线程执行消费。
生产者消费者模型通常使用同步机制来解决生产者线程和消费者线程之间的协调问题,同步块用于保证对共享队列的访问是线程安全的。在Java中,可以使用关键字synchronized来实现同步。通俗来讲,当一个线程访问一个对象的同步块时,同步机制可以防止其他线程同时访问该对象。
2.代码实现
import java.util.LinkedList;//导入队列类
import java.util.Queue;
class ProducerConsumer {
private Queue<Integer> queue = new LinkedList<>();//创建队列对象
private int limit = 10;
private Object lock = new Object();//创建锁
public void produce() throws InterruptedException {
int value = 0;
while (true) {
synchronized (lock) {
while (queue.size() == limit) {
lock.wait();//队满,等待
}
queue.offer(value++);//队未满,生产
lock.notify();//解锁,唤醒线程
}
}
}
public void consume() throws InterruptedException {
while (true) {
synchronized (lock) {
while (queue.isEmpty()) {
lock.wait();//队空,等待
}
int value = queue.poll();//移出队列
System.out.println("Consumed: " + value);
lock.notify();//解锁,唤醒线程
}
Thread.sleep(1000);
}
}
}
public class Main {
public static void main(String[] args) {
ProducerConsumer pc = new ProducerConsumer();
Thread t1 = new Thread(new Runnable() {//创建线程1,生产
public void run() {
try {
pc.produce();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {//创建线程2,消费
public void run() {
try {
pc.consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();//执行线程1
t2.start();//执行线程2
try {
t1.join();//在t1线程执行完之前,其他线程阻塞
t2.join();//在t2程执行完之前,其他线程阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}