欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

用jdk1.5新增API解决生产者消费者问题,jdk1.5api,package cn.i

来源: javaer 分享于  点击 3269 次 点评:215

用jdk1.5新增API解决生产者消费者问题,jdk1.5api,package cn.i


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://byrx.net
相关栏目:

用户点评