首页 > 编程语言 >Java多线程实现生产者与消费者模型

Java多线程实现生产者与消费者模型

时间:2023-09-27 19:59:57浏览次数:35  
标签:container 生产者 wait 线程 obj new Java 多线程 SynContainer

java多线程实现生产者与消费者模型

//测试类
public class TestPC {

    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Thread(new Productor(container),"生产者线程").start();
        new Thread(new Consumer(container),"消费者线程").start();
    }

}

//生产者
class Productor implements Runnable{

    SynContainer container = null;
    
    Productor(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            container.push(new Product(i),i);
        }
    }

}

//消费者
class Consumer implements Runnable{

    SynContainer container = null;

    Consumer(SynContainer container) {
        this.container = container;
    }
    
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            container.pop();
        }
    }

}

//产品
class Product {

    int id;

    Product(int id) {
        this.id = id;
    }

}

//容器
class SynContainer {

    Product[] pros = new Product[10];
    int count = 0;//产品数量

    //生产者放入产品
    public synchronized void push(Product product,int i) {
        if(count == pros.length) {
            try {
                System.out.println("生产者:放不进去了,先等消费者消费吧");
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("生产了第" + i + "个产品");
        pros[count] = product;
        count++;

        this.notifyAll();
    }

    //消费者消费产品
    public synchronized void pop() {
        if(count == 0) {
            try {
                System.out.println("消费者:没东西拿了,先等生产者生产吧");
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count--;
        System.out.println("消费了第" + pros[count].id + "个产品");
        pros[count] = null;

        this.notifyAll();
    }
}
/*当synchronized关键字放在普通方法前,锁对象是类实例本身。
上面的代码中,生产者和消费者中的container对象实质上都是测试类中传入的对象,即同一个对象。*/

线程的wait和notifyAll方法的理解:

  1. obj.wait()方法。obj是被若干线程持有的锁对象,wait方法会阻塞正在持有该锁对象的线程,并释放锁(sleep方法则不会)。在代码中的SynContainer类的push和pop方法都调用了wait方法,当满足条件时,会将对应的线程(生产者or消费者)阻塞并释放锁。
  2. obj.notifyAll()方法。唤醒所有因未持有obj锁对象而被阻塞的线程,常与wait方法搭配使用实现线程通信效果。notify()方法会随机唤醒等待队列中的一个线程。

标签:container,生产者,wait,线程,obj,new,Java,多线程,SynContainer
From: https://www.cnblogs.com/mqDliaolei/p/17734166.html

相关文章

  • 赛码网编程题--打字(Java全A)
    题目描述小明很喜欢打字,今天小红给了小明一个字符串。这个字符串只包含大写和小写字母。我们知道,按下CapsLock键,可以切换大小写模式。我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。在大写模式的时候,按下shift+字母键,就能写出小写字母。现在问题来了,给你一个字符串,......
  • 无涯教程-JavaScript - TRIMMEAN函数
    描述TRIMMEAN函数返回数据集内部的平均值。TRIMMEAN通过从数据集的顶部和底部尾部排除一定百分比的数据点来计算平均值。当您希望从分析中排除外围数据时,可以使用此功能。语法TRIMMEAN(array,percent)争论Argument描述Required/OptionalArrayThearrayorrangeo......
  • 无涯教程-JavaScript - TREND函数
    描述TREND函数沿线性趋势返回值。(使用最小二乘法)将一条直线拟合到阵列known_y和known_x。返回指定的new_x数组沿该行的y值。语法TREND(known_y's,[known_x's],[new_x's],[const])争论Argument描述Required/OptionalKnown_y's在关系y=mx+b中,您已经知道的y值......
  • 【JAVA】关于抽象类的概念
    个人主页:【......
  • 无涯教程-JavaScript - TREND函数
    描述TREND函数沿线性趋势返回值。(使用最小二乘法)将一条直线拟合到阵列known_y和known_x。返回指定的new_x数组沿该行的y值。语法TREND(known_y's,[known_x's],[new_x's],[const])争论Argument描述Required/OptionalKnown_y's在关系y=mx+b中,您已经知道的y......
  • 配java环境在linux上,cuda9.2 old version
    主要参考:https://blog.csdn.net/m0_62946761/article/details/127138742先打个标记#CUDA10.2pipinstalltorch==1.6.0torchvision==0.7.0#CUDA10.1pipinstalltorch==1.6.0+cu101torchvision==0.7.0+cu101-fhttps://download.pytorch.org/whl/torch_stable.html#C......
  • Java动手动脑
    动手动脑Ⅰ程序为什么出错:因为构造函数仅有有参构造。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。 试验publicclassMain{publicstaticvoidmain(String[]args){dn=newd();System.out.println(n.t);n=newd......
  • JavaWeb--文件上传和下载
    上传文件如何实现文件上传要实现Web开发中的文件上传功能,通常只需完成两步操作1、在Web界面中添加上传输入项2、在Servlet中读取上文件的表单页面,并保存到硬盘中文件上传的相关APIFiletem接口它只要用于Commons-FileUpload组件当中,主要是封装单个表单字段元素。DiskFiletemFacto......
  • 【Java】SpringBoot邮件发送实现
    Springboot3邮件发送哔哩哔哩萌狼蓝天微信公众号萌狼蓝天依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>配置这里我用的是网易免费企......
  • [译]JavaScript规范
    译自:https://github.com/airbnb/javascript类型原始值:相当于传值1.string2.number3.boolean4.null5.undefined6.varfoo=1,7.bar=foo;8.9.bar=9;10.11.console.log(foo,bar);//=>1,9复杂类型:相当于传引用1.obje......