Java多线程问题--方法awaitUntil(Date deadline)的用法

本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!

代码地址:https://github.com/xianzhixianzhixian/thread.git

方法awaitUntil(Date deadline)的用法

1、方法condition.awaitUntil(Date deadline)的使用:
condition.awaitUntil(Date deadline)在等待时间之内可以被其它线程唤醒,等待时间一过该线程会自动唤醒,和别的线程争抢锁资源
2、condition.await(long)和condition.awaitUtil(Date deadline)和thread.wait(long)用法一样

方法awaitUntil(Date deadline)的用法示例

Service.java

/**
 * 方法condition.awaitUntil(Date deadline)的使用:
 * condition.awaitUntil(Date deadline)在等待时间之内可以被其它线程唤醒,等待时间一过该线程会自动唤醒,和别的线程争抢锁资源
 * condition.await(long)和condition.awaitUtil(Date deadline)和thread.wait(long)用法一样
 * @author: xianzhixianzhixian
 * @date: 2019-01-22 21:08
 */
public class Service {
    private ReentrantLock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    public void waitMethod(){
        try {
            Calendar calendarRef = Calendar.getInstance();
            calendarRef.add(Calendar.SECOND, 10);
            lock.lock();
            System.out.println("wait begin timer="+System.currentTimeMillis());
            condition.awaitUntil(calendarRef.getTime());
            System.out.println("wait end timer="+System.currentTimeMillis());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void notifyMethod(){
        try {
            Calendar calendarRef = Calendar.getInstance();
            calendarRef.add(Calendar.SECOND, 10);
            lock.lock();
            System.out.println("notify begin timer="+System.currentTimeMillis());
            condition.signalAll();
            System.out.println("notify end timer="+System.currentTimeMillis());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

MyThreadA.java

/**
 * @author: xianzhixianzhixian
 * @date: 2019-01-22 21:07
 */
public class MyThreadA extends Thread {

    private Service service;

    public MyThreadA(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.waitMethod();
    }
}

MyThreadB.java

/**
 * @author: xianzhixianzhixian
 * @date: 2019-01-22 21:07
 */
public class MyThreadB extends Thread {

    private Service service;

    public MyThreadB(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.notifyMethod();
    }
}

Run0.java

/**
 * @author: xianzhixianzhixian
 * @date: 2019-01-22 21:15
 */
public class Run0 {
    public static void main(String[] args) throws Exception {
        Service service = new Service();
        MyThreadA myThreadA = new MyThreadA(service);
        myThreadA.start();
    }
}

运行结果:在10秒之内threadA未被唤醒,在等待10秒之后threadA自动唤醒。

Java多线程问题--方法awaitUntil(Date deadline)的用法_第1张图片

Run1.java

/**
 * @author: xianzhixianzhixian
 * @date: 2019-01-22 21:16
 */
public class Run1 {
    public static void main(String[] args) throws Exception {
        Service service = new Service();
        MyThreadA myThreadA = new MyThreadA(service);
        myThreadA.start();
        Thread.sleep(2000);
        MyThreadB myThreadB = new MyThreadB(service);
        myThreadB.start();
    }
}

运行结果:threadA在10秒内被threadB唤醒,继续执行

Java多线程问题--方法awaitUntil(Date deadline)的用法_第2张图片

 

 

你可能感兴趣的:(Java,多线程)