首页 > 编程语言 >[Java手撕]生产者消费者模型

[Java手撕]生产者消费者模型

时间:2024-09-27 21:46:06浏览次数:8  
标签:Java 生产者 lock 模型 System println new public out

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Main {

    public static final Queue<Integer> message = new LinkedList<>();

    public static ReentrantLock lock = new ReentrantLock();
    public static Condition writeable = lock.newCondition();
    public static Condition readable = lock.newCondition();


    public static void main(String[] args) {


        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("生产者开始运行");
                for (int i = 0; i <= 20; i++) {
                    lock.lock();
                    try {
                        System.out.println("生产者取得队列所有权=======");
                        while (message.size() >= 10) {
                            try {
                                System.out.println("队列中已经有10个消息,生产者阻塞");
                                writeable.await();
                                System.out.println("队列恢复可写,生产者唤醒");
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }
                        if (i == 20) {
                            System.out.println("生产者产生结束信号");
                            message.add(-1);
                            System.out.println("生产者运行结束");
                            readable.signal();
                            break;
                        } else {
                            System.out.println("生产者向队列写入 " + i);
                            message.add(i);
                            System.out.println("唤醒消费者");
                            readable.signal();
                        }
                    } finally {
                        lock.unlock();

                    }
                }
            }
        });


        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("消费者开始运行");
                while (true) {
                    lock.lock();
                    System.out.println("消费者取得队列所有权=======");
                    try {

                        while (message.isEmpty()) {
                            try {
                                System.out.println("消费者等待队列可读");
                                readable.await();
                                System.out.println("消费者恢复可读");
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }
                        Integer a = message.poll();
                        if (a == -1) {
                            System.out.println("消费者读到结束信号,消费者结束");
                            break;
                        }
                        System.out.println("从队列读出 " + a);
                        System.out.println("唤醒生产者");
                        writeable.signal();
                    } finally {
                        lock.unlock();

                    }
                }
                System.out.println("消费者运行结束");
            }
        });

        thread1.start();
        thread2.start();


    }

}

标签:Java,生产者,lock,模型,System,println,new,public,out
From: https://www.cnblogs.com/DCFV/p/18436643

相关文章

  • GPT也会玩《黑神话》?胜率还远超人类?全靠大模型实力!
    导语《黑神话:悟空》这款游戏,以其独特的东方魅力和引人入胜的剧情,在玩家和业界中引发了巨大的热潮。它不仅在界内十分火爆,更是火出了圈,可以在各处看见他的身影,包括奶茶店、咖啡店、商场超市等。这款游戏凭借其精致的画面和深入人心的角色塑造,无疑将为中国游戏产业注入新的活力,......
  • Java中的时间序列分析:从ARIMA到LSTM的应用
    Java中的时间序列分析:从ARIMA到LSTM的应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在机器学习和数据科学领域,时间序列分析是一项重要的技术。它广泛应用于金融、预测分析、传感器数据处理等多个场景。在本文中,我们将重点探讨两种常用的时间......
  • 如何在Java中实现图神经网络进行社交网络分析
    如何在Java中实现图神经网络进行社交网络分析图神经网络(GraphNeuralNetworks,GNNs)是处理图数据的强大工具,尤其在社交网络分析中非常有效。社交网络本质上是一个复杂的图结构,节点代表用户,边表示用户之间的互动或关系。通过GNN,能够捕获节点的局部与全局信息,从而分析社交网......
  • Java中常用类之Object类
    Object类中的常用方法:1.hashCode方法,是对象地址值的另一种表现形式classStudent{Stringname;intage;publicStudent(){}publicStudent(Stringname,intage){this.name=name;this.age=age;}}测试类中是这样进......
  • Javascript 一题搞懂 var 变量提升 & 函数声明提升!
    前置知识:在JavaScript中,“变量提升”(Hoisting)是指在代码执行之前,变量和函数声明会被提升到其所在作用域的顶部。对于使用var关键字声明的变量,会发生变量提升现象。一、声明提升1.变量声明提升:无论var变量在代码中的何处声明,它都会被提升到其所在的函数作用域......
  • 如何让大模型更好地进行场景落地?【文末送书】
    自ChatGPT模型问世后,在全球范围内掀起了AI新浪潮。有很多企业和高校也随之开源了一些效果优异的大模型,例如:Qwen系列模型、MiniCPM序列模型、Yi系列模型、ChatGLM系列模型、Llama系列模型、Baichuan系列模型、Deepseek系列模型、Moss模型等。图片来自:ASurveyofLargeLa......
  • Java中浮点数运算存在的精度问题以及解决方法
    观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗?publicclassTestDouble{publicstaticvoidmain(Stringargs[]){System.out.println("0.05+0.01="+(0.05+0.01));System.out.println("1.0-0.42="+(1.0-0.42));System.out.pr......
  • +在Java中的使用
    阅读以下代码,输出结果是什么?`publicclassTest{publicstaticvoidmain(String[]args){intX=100;intY=200;System.out.println("X+Y="+X+Y);System.out.println(X+Y+"=X+Y");}}`运行结果:为什么会有这样的输出结......
  • 这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了
    大模型(LargeLanguageModels,LLMs)是近年来人工智能领域的一大热点,它们在自然语言处理、对话系统、内容生成等多个方面展现出了强大的能力。随着技术的发展,市面上出现了许多介绍大模型理论与实践的书籍,为研究人员和开发人员提供了宝贵的资源。以下是一些精选的大模型书籍推......
  • 大模型时代,新手和程序员如何转型入局AI行业?
    在近期的全国两会上,“人工智能”再次被提及,并成为国家战略的焦点。这一举措预示着在接下来的十年到十五年里,人工智能将获得巨大的发展红利。技术革命正在从“互联网+”向“人工智能+”逐步迈进,我将迎来新一轮技术革新和人才需求的增长。毫无疑问,AI工程师将是未来最紧俏的岗......