4.1.4ReentrantLock与Condition代替wait/notify

来源:互联网 发布:e宠商城和淘宝哪个靠谱 编辑:程序博客网 时间:2024/06/05 07:36

package demo;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Created by sunyifeng on 17/10/18. */public class MyService {    private Lock lock = new ReentrantLock();    private Condition condition = lock.newCondition();    public void await() {        try {            lock.lock();            System.out.println("开始等待的时间为:" + System.currentTimeMillis());            condition.await();   // FIXME:等同于wait        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();            System.out.println("锁释放了");        }    }    public void signal(){        try {            lock.lock();            System.out.println("开始通知的时间为:" + System.currentTimeMillis());            condition.signal(); // FIXME:等同于notify        } finally {            lock.unlock();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class MyThread extends Thread {    private MyService myService;    public MyThread(MyService myService) {        super();        this.myService = myService;    }    @Override    public void run() {        super.run();        myService.await();    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class Run {    public static void main(String[] args) throws InterruptedException {        MyService myService = new MyService();        MyThread threadA = new MyThread(myService);        threadA.start();        Thread.sleep(3000);        myService.signal();    }}
运行结果:

开始等待的时间为:1508298403673
开始通知的时间为:1508298406678
锁释放了

程序分析:

1、程序没有使用synchronize/wait()/notify()等方法,使用了JDK1.5中的ReentrantLock/Condition对象;

2、有更好的灵活性,可以实现多路通知、有选择性的进行线程通知。