只唤醒对方

来源:互联网 发布:2016淘宝美工有前途吗 编辑:程序博客网 时间:2024/05/28 16:11
package comm;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumerDemo2 {    public static void main(String[] args) {        Resource r = new Resource();        Producer pro = new Producer(r);        Consumer con = new Consumer(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 Resource {    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()                    + "==producer==" + 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()                    + "====consumer====" + this.name);            flag = false;            condition_pro.signal(); // 唤醒对方        } finally {            lock.unlock();        }    }}class Producer implements Runnable {    private Resource res;    Producer(Resource res) {        this.res = res;    }    public void run() {        while (true) {            try {                res.set("+商品+");            } catch (InterruptedException e) {            }        }    }}class Consumer implements Runnable {    private Resource res;    Consumer(Resource res) {        this.res = res;    }    public void run() {        while (true)            try {                res.out();            } catch (InterruptedException e) {            }    }}
0 0