黑马程序员技术交流社区

标题: 多线程显示Lock操作学习笔记 [打印本页]

作者: pengbin    时间: 2015-7-22 10:18
标题: 多线程显示Lock操作学习笔记
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)
                        {               
                        }
                }
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2