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自動喚醒。

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喚醒,繼續執行

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章