本文内容部分引自《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唤醒,继续执行