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
總結
以上是生活随笔為你收集整理的awaitUntil() 方法的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis shutdown (err
- 下一篇: 解决ping的IP 但是ping 不通域