Java整理代码20170807

生产者消费者模式代码实例

利用wait,notify,synchronized和多线程方法实现简单的生产者消费者模式,Java语言,JDK1.8,eclipse


package javaTest;


/** 
* @ClassName: Production 
* @Description: TODO 共享资源类
* @author Qiongjie
* @date 17-08-07 4:07:00 PM
*/
class Production{
    private int i= -1;//产品标识id
    private String name = "unknown";//产品名字
    private boolean isFull=false;//产品队列是否有产品

    /** 
    * @Title: produce 
    * @date 17-08-07 4:07:34 PM
    * @Description: TODO 生产产品
    * @throws Exception
    */
    public synchronized void produce() throws Exception{
        //生产(放入缓冲区)wait要么放在最前,要么最后
        System.out.println("isFull=false开始不断生产...");
        Thread.sleep(3);//模拟生产,sleep不释放锁
        isFull=true;//模拟产品队列已满
        System.out.println("isFull=true产品队列满了"+"\n");
        notify();//唤醒其他线程,但没有释放锁
        if(isFull) {//判断产品队列是否已满
            wait();//释放锁,进入等待态等待被唤醒
        }

    }


    /** 
    * @Title: consume 
    * @date 17-08-07 4:07:56 PM
    * @Description: TODO 消费产品
    * @throws Exception
    */
    public synchronized void consume() throws Exception{
        //消费(放入缓冲区)wait要么放在最前,要么最后
        System.out.println("isFull=true开始不断消费...");
        Thread.sleep(3000);//模拟消费,sleep不释放锁
        isFull=false;//模拟产品队列已消费完
        System.out.println("isFull=false产品队列消费完了"+"\n");
        notify();//唤醒其他线程,但没有释放锁
        if(!isFull) {//判断产品队列是否已消费完
            wait();//释放锁,进入等待态等待被唤醒
        }
    }
}

/** 
* @ClassName: Producer 
* @Description: TODO生产线程 
* @author Qiongjie
* @date 17-08-07 4:08:19 PM
*/
class Producer implements Runnable{
    Production production;

    /** 
    * <p>构造函数: Producer</p> 
    * <p>Description: 传入公共资源对象</p> 
    * @param production 
    */
    public Producer(Production production) {
        // TODO 传入公共资源对象
        this.production=production;
    }


    public void run() {
        while(true) {
                try {
                    production.produce();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
}

/** 
* @ClassName: Consumer 
* @Description: TODO 消费线程
* @author Qiongjie
* @date 17-08-07 4:16:42 PM
*/
class Consumer implements Runnable{
    Production production;

    /** 
    * <p>构造函数: Consumer</p> 
    * <p>Description: 传入公共资源对象</p> 
    * @param production 
    */
    public Consumer(Production production) {
        // TODO 传入公共资源对象
        this.production=production;
    }

    public void run() {
        while (true) {
            try {
                production.consume();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

/** 
* @ClassName: Test 
* @Description: TODO 运行测试类
* @author Qiongjie
* @date 17-08-07 4:06:56 PM
*/
public class Test {
    public static void main(String[] args) {
        Production production=new Production();//创建公共资源
        new Thread(new Producer(production)).start();//利用公共资源创建生产线程并启动
        new Thread(new Consumer(production)).start();//利用公共资源创建消费线程并启动
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值