java多线程代码

admin 26 0

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(); // 通知生产者继续生产
                }
            }
        }
    }
}