返回顶部

收藏

用jdk1.5新增API解决生产者消费者问题

更多
package cn.itcast.gz;

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

/*
jdk1.5以后将同步和锁封装成了对象。 
并将操作锁的隐式方式定义到了该对象中,
将隐式动作变成了显示动作。

Lock接口: 出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成现实锁操作。
同时更为灵活。可以一个锁上加上多组监视器。
lock():获取锁。
unlock():释放锁,通常需要定义finally代码块中。

Condition接口:出现替代了Object中的wait notify notifyAll方法。
            将这些监视器方法单独进行了封装,变成Condition监视器对象。
            可以任意锁进行组合。
await();     让线程等待,同时释放锁
signal();    唤醒同一把锁中的任意一个等待的线程
signalAll(); 唤醒同一把锁中的所有等待的线程

*/
public class ProducerConsumerDemo {

    public static void main(String[] args) {

        Resource4 r = new Resource4();

        Producer producer = new Producer(r);
        Consumer consumer = new Consumer(r);

        Thread t1 = new Thread(producer);
        Thread t2 = new Thread(producer);
        Thread t3 = new Thread(consumer);
        Thread t4 = new Thread(consumer);

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }

}

class Resource4 
{   

    Lock lock = new ReentrantLock();
    Condition pro = lock.newCondition();
    Condition con = lock.newCondition();

    private boolean flag= false;
    private int num= 0;
    public  void product()
    {
        lock.lock();
        try{    
            while(flag)
            try{pro.await();}catch(Exception e){e.printStackTrace();};
            num++;
            System.out.println("生产烤鸭"+num);
            flag = true;
            con.signal();
        }
        finally
        {
            lock.unlock();
        }
    }

    public  void consumer()
    {  
        lock.lock();
        try
        {
        while(!flag)
        try{con.await();}catch(Exception e){e.printStackTrace();};
        System.out.println("消费烤鸭                    "+num);
        flag = false;
        pro.signal();
    }
        finally
        {
            lock.unlock();
        }
    }

}

class Producer  implements Runnable
{
    private Resource4 r ;
    public Producer(Resource4 r)
    {
        this.r = r;
    }

    @Override
    public void run() {

        while(true)
        r.product();
    }
}

class Consumer implements Runnable
{
    private Resource4 r;
    public Consumer(Resource4 r)
    {
        this.r = r;
    }

     @Override
    public void run() {

         while(true)
         r.consumer();
    }
}
//该片段来自于http://outofmemory.cn

标签:java,基础

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 博主 发表 2013-03-12 14:17:00 Java基础学习之Enum
  2. Terry Zhang 发表 2014-04-18 05:19:53 [NIO.2] 编写一个文件移动应用
  3. Terry Zhang 发表 2014-05-13 06:28:25 [集合框架] SortedMap 接口
  4. 逍遥冲 发表 2014-02-16 15:32:11 Java8新特性Date和Time
  5. 博主 发表 2013-03-22 16:26:00 Java基础知识之泛型
  6. Terry Zhang 发表 2014-05-04 12:29:21 [集合框架] Queue 接口
  7. 糖果 发表 2015-08-03 21:33:22 逆向基础(十三) JAVA (四)
  8. 博主 发表 2013-03-27 17:01:00 Java基础知识之Annotation
  9. Terry Zhang 发表 2014-04-20 15:36:04 [正则] 预定义字符类型
  10. root 发表 2015-04-26 02:40:02 Java 基础:认识&理解关键字 native 实战篇
  11. 糖果 发表 2015-08-03 20:25:16 逆向基础(十三) JAVA (三)
  12. Terry Zhang 发表 2014-05-03 06:47:05 [集合框架] Deque 接口

发表评论