本文內容部分引自《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喚醒,繼續執行