awaituntil() 等到 boolean awaitUntil(Date deadline) throws InterruptedException Date 时间时释放锁。当另一个线程获得了锁没有释放时,虽然awituntil时间已经到了,它没有锁,所以必须等到另一个线程释放锁之后它在执行awaituntil下面的内容。当另一个线程获得锁后,后来已经释放,因为notiyAll 会唤醒所有线程,所以使用awituntil方法的线程也将被唤醒,但如果不使用notifyall来唤醒线程则使用awaitUntil线程还是会等待当前时间到了之后才会被唤醒 因为当它再次得到锁它还是处于等待状态,等到达设定的时间才会被唤醒。例子如下:
package com.RentTrantLock;
public class RunawitUntil {
public static void main(String[] args) {
AwaitUntilService service=new AwaitUntilService();
MythreadAwitUntilA mythread=new MythreadAwitUntilA(service);
MythreadAwitUntilB mythread1=new MythreadAwitUntilB(service);
mythread1.start();
mythread.start();
}
}
package com.RentTrantLock;
import java.util.Calendar;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class AwaitUntilService {
private ReentrantLock lock=new ReentrantLock();
private Condition condition=lock.newCondition();
public void TestMethod(){
try{
Calendar calendarRef=Calendar.getInstance();
System.out.println("CalendarRenf:"+calendarRef);
calendarRef.add(Calendar.SECOND, 3);
System.out.println("CalendarRenf1:"+calendarRef);
lock.lock();
System.out.println("wait begin time="+System.currentTimeMillis());
condition.awaitUntil(calendarRef.getTime());
System.out.println("wait end time ="+System.currentTimeMillis());
}catch(InterruptedException e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void notifyMethod(){
try{
Calendar calendarRenf=Calendar.getInstance();
System.out.println("CalendarRenf:"+calendarRenf);
calendarRenf.add(Calendar.SECOND, 10);
System.out.println("CalendarRenf1:"+calendarRenf);
lock.lock();
System.out.println("notify begin timer="+System.currentTimeMillis());
/* try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
// condition.signalAll();
System.out.println("notify end time="+System.currentTimeMillis());
}finally{
lock.unlock();
}
}
}
package com.RentTrantLock;
public class MythreadAwitUntilB extends Thread{
private AwaitUntilService service;
public MythreadAwitUntilB(AwaitUntilService service){
this.service=service;
}
public void run(){
service.notifyMethod();
}
}
运行结果
CalendarRenf:java.util.GregorianCalendar[time=1511444014513,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=327,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=33,SECOND=34,MILLISECOND=513,ZONE_OFFSET=28800000,DST_OFFSET=0]
CalendarRenf:java.util.GregorianCalendar[time=1511444014513,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=327,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=33,SECOND=34,MILLISECOND=513,ZONE_OFFSET=28800000,DST_OFFSET=0]
CalendarRenf1:java.util.GregorianCalendar[time=1511444017513,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=327,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=33,SECOND=37,MILLISECOND=513,ZONE_OFFSET=28800000,DST_OFFSET=0]
CalendarRenf1:java.util.GregorianCalendar[time=1511444024513,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=327,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=33,SECOND=44,MILLISECOND=513,ZONE_OFFSET=28800000,DST_OFFSET=0]
wait begin time=1511444014531
notify begin timer=1511444014531
notify end time=1511444014531
wait end time =1511444017516