ReentrantLock

巧了我就是萌 提交于 2019-11-28 00:53:42

Condition可以选择性的进行线程通知,在调度线程上更加灵活。

wait/notify方法进行通知时,被通知的线程是有JVM随机选择的,Condition的signal可以"选择性的通知"

生产者/消费者模式 打印奇数偶数

//锁对象 ,必须是同一把锁public class Num {
    int i=1;
    boolean flag=false;
    Lock lock=new ReentrantLock();
    Condition condition=lock.newCondition();
}

public class EvenPrint implements Runnable    {
    private Num num;

    public EvenPrint(Num num){
        this.num=num;
    }

    @Override
    public void run() {
        while (num.i<=500){            //上锁
            num.lock.lock();
            if(num.i%2==0){
                System.out.println(Thread.currentThread().getName()+  "偶数——————"+num.i);
                num.i++;               //唤醒 奇数线程
                num.condition.signal();

            }else{
                try {          //等待
                    num.condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class OddPrint implements Runnable {
    private Num num;

    public OddPrint(Num num) {
        this.num = num;
    }

    @Override
    public void run() {
        while (num.i <= 500) {
            num.lock.lock();
            if (num.i%2 !=0) {
                System.out.println(Thread.currentThread().getName() + "奇数——————" + num.i);
                num.i++;
                num.condition.signal();

            } else {
                try {
                    num.condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class Run {
    public static void main(String[] args) {
        Num num = new Num();
        OddPrint oddPrint = new OddPrint(num);
        EvenPrint evenPrint = new EvenPrint(num);
        Thread thread1 = new Thread(oddPrint);
        Thread thread2 = new Thread(evenPrint);
        thread1.setName("奇数线程");
        thread1.start();
        thread2.setName("偶数线程");
        thread2.start();
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!