Java多线程代码示例:生产者消费者模型
在Java中,多线程编程是一种常见的编程模式,用于提高程序的执行效率,下面是一个简单的生产者消费者模型的Java多线程代码示例。
生产者消费者模型是一种常见的多线程同步问题,其中生产者负责生成一定量的数据放入缓冲区,而消费者则从缓冲区中取出数据,为了避免缓冲区溢出和数据丢失,需要使用同步机制来控制生产者和消费者的操作。
import java.util.LinkedList; import java.util.Queue; public class ProducerConsumerExample { private static final int MAX_SIZE = 5; // 缓冲区最大容量 private static final Queue<Integer> buffer = new LinkedList<>(); // 缓冲区 private static final Object lock = new Object(); // 同步锁 public static void main(String[] args) { Thread producer = new Thread(new Producer()); // 创建生产者线程 Thread consumer = new Thread(new Consumer()); // 创建消费者线程 producer.start(); // 启动生产者线程 consumer.start(); // 启动消费者线程 } private static class Producer implements Runnable { @Override public void run() { while (true) { synchronized (lock) { // 获取同步锁 while (buffer.size() == MAX_SIZE) { // 缓冲区已满,等待消费者消费 try { lock.wait(); // 等待消费者消费完毕 } catch (InterruptedException e) { e.printStackTrace(); } } buffer.offer(produce()); // 生产数据并放入缓冲区 System.out.println("Produced: " + buffer.size()); // 打印生产数量 lock.notifyAll(); // 通知消费者消费 } } } private int produce() { return (int) (Math.random() * 100); // 模拟生产数据的过程 } } private static class Consumer implements Runnable { @Override public void run() { while (true) { synchronized (lock) { // 获取同步锁 while (buffer.isEmpty()) { // 缓冲区为空,等待生产者生产 try { lock.wait(); // 等待生产者生产完毕 } catch (InterruptedException e) { e.printStackTrace(); } } int data = buffer.poll(); // 从缓冲区取出数据并消费 System.out.println("Consumed: " + buffer.size()); // 打印消费数量 lock.notifyAll(); // 通知生产者继续生产 } } } } }