awaitUntil() 方法的使用

        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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值