Java整理代码20170807

来源:互联网 发布:程序员离职前放木马 编辑:程序博客网 时间:2024/06/04 20:08

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

利用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();//利用公共资源创建消费线程并启动    }}
原创粉丝点击