生产者和消费者

  • 如果生产者的队列满了(while循环判断是否满),则等待。如果生产者的队列没满,则生产数据并唤醒消费者进行消费。

  • 如果消费者的队列空了(while循环判断是否空),则等待。如果消费者的队列没空,则消费数据并唤醒生产者进行生产。

package test;

 

import java.util.Random;

import java.util.Vector;

import java.util.concurrent.atomic.AtomicInteger;

 

public class Producer implements Runnable {

 

    // true--->生产者一直执行,false--->停掉生产者

    private volatile boolean isRunning = true;

 

    // 公共资源

    private final Vector sharedQueue;

 

    // 公共资源的最大数量

    private final int SIZE;

 

    // 生产数据

    private static AtomicInteger count = new AtomicInteger();

 

    public Producer(Vector sharedQueue, int SIZE) {

        this.sharedQueue = sharedQueue;

        this.SIZE = SIZE;

    }

 

    @Override

    public void run() {

        int data;

        Random r = new Random();

 

        System.out.println("start producer id = " + Thread.currentThread().getId());

        try {

            while (isRunning) {

                // 模拟延迟

                Thread.sleep(r.nextInt(1000));

 

                // 当队列满时阻塞等待

                while (sharedQueue.size() == SIZE) {

                    synchronized (sharedQueue) {

                        System.out.println("Queue is full, producer " + Thread.currentThread().getId()

                                + " is waiting, size:" + sharedQueue.size());

                        sharedQueue.wait();

                    }

                }

 

                // 队列不满时持续创造新元素

                synchronized (sharedQueue) {

                    // 生产数据

                    data = count.incrementAndGet();

                    sharedQueue.add(data);

 

                    System.out.println("producer create data:" + data + ", size:" + sharedQueue.size());

                    sharedQueue.notifyAll();

                }

            }

        } catch (InterruptedException e) {

            e.printStackTrace();

            Thread.currentThread().interrupted();

        }

    }

 

    public void stop() {

        isRunning = false;

    }

}

 

 

package test;

 

import java.util.Random;

import java.util.Vector;

 

public class Consumer implements Runnable {

 

    // 公共资源

    private final Vector sharedQueue;

 

    public Consumer(Vector sharedQueue) {

        this.sharedQueue = sharedQueue;

    }

 

    @Override

    public void run() {

 

        Random r = new Random();

 

        System.out.println("start consumer id = " + Thread.currentThread().getId());

        try {

            while (true) {

                // 模拟延迟

                Thread.sleep(r.nextInt(1000));

 

                // 当队列空时阻塞等待

                while (sharedQueue.isEmpty()) {

                    synchronized (sharedQueue) {

                        System.out.println("Queue is empty, consumer " + Thread.currentThread().getId()

                                + " is waiting, size:" + sharedQueue.size());

                        sharedQueue.wait();

                    }

                }

                // 队列不空时持续消费元素

                synchronized (sharedQueue) {

                    System.out.println("consumer consume data:" + sharedQueue.remove(0) + ", size:" + sharedQueue.size());

                    sharedQueue.notifyAll();

                }

            }

        } catch (InterruptedException e) {

            e.printStackTrace();

            Thread.currentThread().interrupt();

        }

    }

}

 

 

 

package test;

 

import java.util.Vector;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

 

public class Test2 {

 

 

    public static void main(String[] args) throws InterruptedException {

 

        // 1.构建内存缓冲区

        Vector sharedQueue = new Vector();

        int size = 4;

 

        // 2.建立线程池和线程

        ExecutorService service = Executors.newCachedThreadPool();

        Producer prodThread1 = new Producer(sharedQueue, size);

        Producer prodThread2 = new Producer(sharedQueue, size);

        Producer prodThread3 = new Producer(sharedQueue, size);

        Consumer consThread1 = new Consumer(sharedQueue);

        Consumer consThread2 = new Consumer(sharedQueue);

        Consumer consThread3 = new Consumer(sharedQueue);

        service.execute(prodThread1);

        service.execute(prodThread2);

        service.execute(prodThread3);

        service.execute(consThread1);

        service.execute(consThread2);

        service.execute(consThread3);

 

        // 3.睡一会儿然后尝试停止生产者(结束循环)

        Thread.sleep(10 * 1000);

        prodThread1.stop();

        prodThread2.stop();

        prodThread3.stop();

 

        // 4.再睡一会儿关闭线程池

        Thread.sleep(3000);

 

        // 5.shutdown()等待任务执行完才中断线程(因为消费者一直在运行的,所以会发现程序无法结束)

        service.shutdown();

 

 

    }

}

 

posted on   我是司  阅读(322)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示