Java几种方式实现生产者与消费者

第一种是 用wait 和 notify

 

第二种是await 和signal实现

 

 

 

代码实现如下:

package cn.link.cn.jisun;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 题目是:一个初始为零的变量,两个线程对其交替操作,一个加1 一个减1 来轮
 * 1. 线程  操作(方法) 资源类
 *
 * 2. 判断   干活       通知
 *
 * 3. 防止虚拟唤醒机制
 */
class ShareData{
    private  int number = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    public  void  increment () throws Exception{
        try {
            lock.lock();
            //判断
            while (number != 0 ){
                //等待不生产
                condition.await();
            }
            number ++;
            //干活
            System.out.println(Thread.currentThread().getName()+"==>"+number);
            condition.signalAll();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    /**
     *
     */
    public  void  decrement () throws Exception{
        try {
            lock.lock();
            while (number == 0 ){
                condition.await();
            }
            number --;
            System.out.println(Thread.currentThread().getName()+"==>"+number);
            condition.signalAll();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}

public class ProductAndCousumer {
/**
 * @Description:    java类作用描述

 * @Author:         zhaohaiming

 * @CreateDate:     2019/7/25 23:40

 * @Version:        1.0

 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    ShareData shareData  = new ShareData();
    for ( int index =  0 ;index < 5;index++){

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    shareData.increment();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    shareData.decrement();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

}

运行结果:

Thread-0==>1
Thread-1==>0
Thread-2==>1
Thread-3==>0
Thread-4==>1
Thread-5==>0
Thread-6==>1
Thread-7==>0
Thread-8==>1
Thread-9==>0

第三种 使用阻塞队列

package cn.link.cn.jisun;


import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

class  SharData{
    private  volatile  boolean flag = true;
    private AtomicInteger atomicInteger = new AtomicInteger();
    private BlockingQueue<String>  blockingQueue = null;

    public SharData(BlockingQueue<String> blockingQueue) {
        this.blockingQueue = blockingQueue;
        System.out.println(Thread.currentThread().getName());
    }
     public  void myProduct() throws InterruptedException {
        String data = null;
        boolean reValue ;
        while (flag){
            data = atomicInteger.incrementAndGet()+"";
            reValue = blockingQueue.offer(data,2, TimeUnit.SECONDS);
            if (reValue){
                System.out.println(Thread.currentThread().getName()+"\t 插入队列数据成功!");
            }else {
                System.out.println(Thread.currentThread().getName()+"\t 插入队列数据失败!");
            }
            TimeUnit.SECONDS.sleep(1);
        }
         System.out.println(Thread.currentThread().getName()+"\t 大佬拍板 停此生产");
     }
    public void myConsum() throws  Exception{
        String result ;
        while (flag){
            result = blockingQueue.poll(2,TimeUnit.SECONDS);
            if(null == result || result.equalsIgnoreCase("") ){
                flag  = false;
                System.out.println(Thread.currentThread().getName()+"\t 超出两秒钟没有取出蛋糕,消费队列退出!");
                return;
            }
            System.out.println(Thread.currentThread().getName()+"\t 消费队列蛋糕"+result+"成功!");
        }


    }
    public  void  stop (){
        flag = false;
    }
}


public class ProductAndConsu01 {
    /**
     * @Description:    java类作用描述
    
     * @Author:         zhaohaiming
    
     * @CreateDate:     2019/7/27 20:35
    
     * @Version:        1.0
    
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SharData sharData = new SharData(new ArrayBlockingQueue<String>(10));

        new  Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"\t 生产者开始启动!");
                try {
                    sharData.myProduct();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new  Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"\t 消费者开始启动!");
                try {
                    sharData.myConsum();
                    System.out.println();
                    System.out.println();
                    System.out.println();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();


        System.out.println();
        System.out.println();
        System.out.println();
        try {
            TimeUnit.SECONDS.sleep(5);
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        };
        System.out.println();
        System.out.println();
        System.out.println();

        System.out.println("5秒钟时间到达了 ,活动会议室停此");

        sharData.stop();
    }
}

运行结果:

main



Thread-0	 生产者开始启动!
Thread-1	 消费者开始启动!
Thread-0	 插入队列数据成功!
Thread-1	 消费队列蛋糕1成功!
Thread-0	 插入队列数据成功!
Thread-1	 消费队列蛋糕2成功!
Thread-0	 插入队列数据成功!
Thread-1	 消费队列蛋糕3成功!
Thread-0	 插入队列数据成功!
Thread-1	 消费队列蛋糕4成功!
Thread-1	 消费队列蛋糕5成功!
Thread-0	 插入队列数据成功!




5秒钟时间到达了 ,活动会议室停此
Thread-0	 大佬拍板 停此生产
Thread-1	 超出两秒钟没有取出蛋糕,消费队列退出!

注意生产与消费是同时进行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值