首页
学习
活动
专区
工具
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对象实现了生产者和消费者之间的等待和唤醒机制。

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

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

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

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

相关·内容

《Java-SE-第二十四章》之线程间协作

​ 再次之前我们已经解决了,如果多个任务交替着步入某项共享资源,可以使用互斥来使得任何时刻只有一个任务可以访问这项资源。现在我们需要学习如何使任务彼此之间可以协作,可以达到多个任务一起工作去解决某个问题。现在的问题不是线程之间的干涉,而是线程之间的协作。线程之间的协调涉及到某些部分任务必须在其他 部分被解决之前解决。这非常像盖房子,必须先挖好房子的地基,然后同时设计好地基所需的钢结构和和水泥,而这两项任务必须在浇筑地基之前完成。水泥浇筑完之后才可以在此基础上砌墙。在这些任务中,某些可以并行执行,但是某些步骤需要所有的任务结束之后才能开动。

04

JAVA线程通信详解[通俗易懂]

线程与线程之间不是相互独立的个体,它们彼此之间需要相互通信和协作,最典型的例子就是生产者-消费者问题:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。同样地,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种互相通信的过程就是线程间的协作。本文首先介绍 wait/notify 机制,并对实现该机制的两种方式——synchronized+wait-notify模式和Lock+Condition模式进行详细剖析,以作为线程间通信与协作的基础。进一步地,以经典的生产者-消费者问题为背景,熟练对 wait/notify 机制的使用。最后对 Thread 类中的 join() 方法进行源码分析,并以宿主线程与寄生线程的协作为例进行说明。在下面的例子中,虽然两个线程实现了通信,但是凭借线程B不断地通过while语句轮询来检测某一个条件,这样会导致CPU的浪费。因此,需要一种机制来减少CPU资源的浪费,而且还能实现多个线程之间的通信,即 wait/notify 机制。

02
领券