JAVA多线程(九)Java多线程之生产者与消费者

1.JAVA多线程(九)Java多线程之生产者与消费者

  • 需求如下:自定义多线程生产者与消费者
  • 1.如果生产者没有生产消息,就需要去生产消息,消费者就需要等待消费者生产完以后再去消费。
  • 2.如果消费者没有消费消息,那么生产者就需要等待,消费都消费完成后,再去生产消息。

1.1 生产者与消费者【一个生产线程和一个消费者线程】

package com.yuanxw.chapter9;
/**
 * 自定义多线程生产者与消费者
 * 1.如果生产者没有生产消息,就需要去生产消息,消费者就需要等待消费者生产完以后再去消费。
 * 2.如果消费者没有消费消息,那么生产者就需要等待,消费都消费完成后,再去生产消息。
 */
public class ProduceConsumer {
   
    /** 生产数量 **/
    private int num = 0;
    /** 锁 **/
    protected final Object LOCK = new Object();
    /** volatile:内存可见性关键字,默认为没有生产,可以进行生产 **/
    private volatile boolean isProducted = false;

    /**
     * 生产方法
     * @return
     */
    public void produce() throws InterruptedException {
   
        // 同步生产
        synchronized (LOCK){
   
            // 如果消息已经生产,需要等待消费者消费后再去生产
            if(isProducted){
   
                /**
                 * 调用 wait() 使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程的运行使得这个条件满足时,其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。
                 * 它们都属于 Object 的一部分,而不属于 Thread。
                 */
                LOCK.wait();
            }else {
   
                // 如果已经消费,那么就需要进行生产
                num++;
                System.out.println(String.format("生产消息>>【%s】", num));
                /**
                 * 调用 wait() 使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程的运行使得这个条件满足时,其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。
                 * 它们都属于 Object 的一部分,而不属于 Thread。
                 */
                // 通知消费者,可以进行消费
                LOCK.notify();
                // 设置标记:已经生产
                isProducted = true;
            }
        }
    }

    /**
     * 消费方法
     */
    public void consumer() throws InterruptedException {
   
        // 同步消费
        synchronized (LOCK){
   
            /
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值