diff --git a/src/main/java/logicface/LogicFaceICN.java b/src/main/java/logicface/LogicFaceICN.java index f0e54f6..e334400 100644 --- a/src/main/java/logicface/LogicFaceICN.java +++ b/src/main/java/logicface/LogicFaceICN.java @@ -10,9 +10,11 @@ import packet.*; import util.ConcurrentHelper; import util.TimeHelper; +import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Timer; +import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.locks.Lock; /* @@ -27,7 +29,14 @@ public class LogicFaceICN extends LogicFace { public long recentExpireTime; // 最近将要超时的时间戳 public Map mPit; // PIT表 public Lock timeoutEventHeapLock; // 锁, mpit 、timeoutEventHeap、recentExpireTime - public TimeoutEventHeap timeoutEventHeap; // 超时事件堆, 以超时时间排序的最小堆 + // 超时事件堆, 以超时时间排序的最小堆,初始化大小为1000 + public PriorityBlockingQueue timeoutEventHeap + =new PriorityBlockingQueue(1000,new Comparator(){ + @Override + public int compare(TimeoutEvent o1, TimeoutEvent o2) { + return Long.compare(o1.timeoutTime,o2.timeoutTime); + } + }); public Map mFib; @@ -158,8 +167,8 @@ public class LogicFaceICN extends LogicFace { private void dealWithTimeout(){ long currentTime= TimeHelper.getTimestampMS(); this.timeoutEventHeapLock.lock(); - while((this.timeoutEventHeap.len()>0)&&(this.timeoutEventHeap.get(0).timeoutTime<=currentTime)){ - TimeoutEvent timeEvent=timeoutEventHeap.pop(); + while((this.timeoutEventHeap.size()>0)&&(this.timeoutEventHeap.peek().timeoutTime<=currentTime)){ + TimeoutEvent timeEvent=timeoutEventHeap.poll(); PITEntry pitEntry=this.mPit.get(timeEvent.key); if(pitEntry!=null){ if(pitEntry.expireTime<=currentTime){ @@ -167,13 +176,13 @@ public class LogicFaceICN extends LogicFace { this.mPit.remove(timeEvent.key); }else{ timeEvent.timeoutTime=pitEntry.expireTime; - timeoutEventHeap.push(timeEvent); + timeoutEventHeap.add(timeEvent); } } } - if(this.timeoutEventHeap.len()>0){ + if(this.timeoutEventHeap.size()>0){ // this.timer. todo: 什么鬼??? - this.recentExpireTime=this.timeoutEventHeap.get(0).timeoutTime; + this.recentExpireTime=this.timeoutEventHeap.peek().timeoutTime; }else{ // this.timer. todo: 什么鬼??? this.recentExpireTime=currentTime+500000; @@ -245,13 +254,13 @@ public class LogicFaceICN extends LogicFace { */ public void tryResetTimer(){ this.timeoutEventHeapLock.lock(); - if(this.timeoutEventHeap.len()<=0){ + if(this.timeoutEventHeap.size()<=0){ this.timeoutEventHeapLock.unlock(); return; } - if(this.timeoutEventHeap.get(0).timeoutTime timeoutEvents=new LinkedList<>(); - - public boolean less(int i,int j){ - return timeoutEvents.get(i).timeoutTime < timeoutEvents.get(j).timeoutTime; - } - - public int len(){ - return timeoutEvents.size(); - } - - public TimeoutEvent get(int index){ - return timeoutEvents.get(index); - } - - public void set(int index,TimeoutEvent timeoutEvent){ - timeoutEvents.set(index,timeoutEvent); - // todo: 堆排序 - } - - public void swap(int i,int j){ - TimeoutEvent cache=timeoutEvents.get(i); - timeoutEvents.set(i,timeoutEvents.get(j)); - timeoutEvents.set(j,cache); - } - - public void push(TimeoutEvent timeoutEvent){ - timeoutEvents.add(timeoutEvent); - // todo: 堆排序 - } - - public TimeoutEvent pop(){ - TimeoutEvent timeoutEvent=timeoutEvents.get(timeoutEvents.size()-1); - timeoutEvents.remove(timeoutEvents.size()-1); - // todo: 堆排序 - return timeoutEvent; - } -}