首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中使用锁的生产者/消费者线程示例

在Java中,使用锁的生产者/消费者线程示例是一种常见的多线程编程模式,用于解决生产者和消费者之间的数据同步和通信问题。下面是一个简单的示例:

代码语言:txt
复制
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ProducerConsumerExample {
    private static final int BUFFER_SIZE = 10;
    private static final Queue<Integer> buffer = new LinkedList<>();
    private static final Lock lock = new ReentrantLock();
    private static final Condition notFull = lock.newCondition();
    private static final Condition notEmpty = lock.newCondition();

    public static void main(String[] args) {
        Thread producerThread = new Thread(new Producer());
        Thread consumerThread = new Thread(new Consumer());

        producerThread.start();
        consumerThread.start();
    }

    static class Producer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    lock.lock();
                    try {
                        while (buffer.size() == BUFFER_SIZE) {
                            notFull.await();
                        }
                        int item = produceItem();
                        buffer.offer(item);
                        System.out.println("Produced: " + item);
                        notEmpty.signalAll();
                    } finally {
                        lock.unlock();
                    }
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        private int produceItem() {
            // 生成一个随机数作为生产的物品
            return (int) (Math.random() * 100);
        }
    }

    static class Consumer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    lock.lock();
                    try {
                        while (buffer.isEmpty()) {
                            notEmpty.await();
                        }
                        int item = buffer.poll();
                        System.out.println("Consumed: " + item);
                        notFull.signalAll();
                    } finally {
                        lock.unlock();
                    }
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

这个示例中,使用了一个有界队列作为缓冲区,生产者线程负责生成物品并将其放入缓冲区,消费者线程负责从缓冲区中取出物品进行消费。为了保证线程安全和数据同步,使用了ReentrantLock作为锁,并通过Condition对象实现了生产者和消费者之间的等待和唤醒机制。

该示例中的生产者线程在缓冲区已满时等待,直到缓冲区有空闲位置才继续生产物品;消费者线程在缓冲区为空时等待,直到缓冲区有物品可供消费才继续消费。通过使用锁和条件变量,生产者和消费者之间实现了有效的线程通信和同步。

这种生产者/消费者模式在实际应用中非常常见,例如消息队列、线程池等场景都可以使用该模式来实现任务的生产和消费。在云计算领域,生产者/消费者模式可以用于异步任务处理、消息队列服务等场景。

腾讯云提供了一系列与云计算相关的产品和服务,例如云服务器、云数据库、云存储、人工智能等。具体推荐的产品和产品介绍链接地址可以根据实际需求和场景进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券