A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pengbin 中级黑马   /  2015-7-22 10:18  /  509 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.concurrent.locks.*;



/*
* 对于多个生产者,多个消费者。(5.0升级版)
* 将同步synchronized 替换成显示Lock操作。
* 将Object中的wait,notify,notifyAll,替换了Condition对象。
* 该对象可以通过Lock锁进行获取。
*
* 该实例中,实现了本方只唤醒对方的操作。
*
*/


public class ThreadDemo7
{
        public static void main(String[] args)
        {
                Resource1 r = new Resource1();
               
                Producer1 pro = new Producer1(r);
                Consumer1 con = new Consumer1(r);
               
                Thread t1 = new Thread(pro);
                Thread t2 = new Thread(pro);
                Thread t3 = new Thread(con);
                Thread t4 = new Thread(con);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}


class Resource1
{
        private String name;
        private int count = 1;
        private boolean flag = false;
       
        private Lock lock = new ReentrantLock();
       
        private Condition condition_pro = lock.newCondition();
        private Condition condition_con = lock.newCondition();
       
        public  void set(String name)throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(flag)
                                condition_pro.await();
                        this.name = name+"...."+count++;
                       
                        System.out.println(Thread.currentThread().getName()+"+++生产者+++"+this.name);
                        flag = true;
                        condition_con.signal();
                }
                finally
                {
                        lock.unlock();//释放锁的操作一定要执行。
                }
        }
       
        public  void out()throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(!flag)
                        condition_con.await();
                        System.out.println(Thread.currentThread().getName()+"-----消费者-----"+this.name);       
                        flag = false;
                        condition_pro.signal();
                }
                finally
                {
                        lock.unlock();
                }
        }
}

class Producer1 implements Runnable
{
        private Resource1 res;
       
        Producer1(Resource1 res)
        {
                this.res = res;
        }
        public void run()
        {
                while(true)
                {
                        try
                        {
                                res.set("商品");
                        }
                        catch(InterruptedException e)
                        {       
                        }
                }
        }
}

class Consumer1 implements Runnable
{
        private Resource1 res;
       
        Consumer1(Resource1 res)
        {
                this.res = res;
        }
        public void run()
        {
                while(true)
                {
                        try
                        {
                                res.out();
                        }
                        catch(InterruptedException e)
                        {               
                        }
                }
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马