use PriorityBlockingQueue to implements TimeoutEventHeap

This commit is contained in:
free will committed 2021-04-19 15:36:33 +08:00
1 parent c48ff6652f
commit 212d9638c4
2 files changed
+20 -62

No files matched your search

+20 -11
View File
@@ -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<String, PITEntry> mPit; // PIT表
public Lock timeoutEventHeapLock; // 锁, mpit 、timeoutEventHeap、recentExpireTime
public TimeoutEventHeap timeoutEventHeap; // 超时事件堆, 以超时时间排序的最小堆
// 超时事件堆, 以超时时间排序的最小堆,初始化大小为1000
public PriorityBlockingQueue<TimeoutEvent> timeoutEventHeap
=new PriorityBlockingQueue<TimeoutEvent>(1000,new Comparator<TimeoutEvent>(){
@Override
public int compare(TimeoutEvent o1, TimeoutEvent o2) {
return Long.compare(o1.timeoutTime,o2.timeoutTime);
}
});
public Map<String, OnInterestInterface> 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<this.recentExpireTime){
long durationMs=this.timeoutEventHeap.get(0).timeoutTime-TimeHelper.getTimestampMS();
this.recentExpireTime=this.timeoutEventHeap.get(0).timeoutTime;
if(this.timeoutEventHeap.peek().timeoutTime<this.recentExpireTime){
long durationMs=this.timeoutEventHeap.peek().timeoutTime-TimeHelper.getTimestampMS();
this.recentExpireTime=this.timeoutEventHeap.peek().timeoutTime;
// todo: this.timer.Reset
}
this.timeoutEventHeapLock.unlock();
@@ -280,7 +289,7 @@ public class LogicFaceICN extends LogicFace {
timeEvent.timeoutTime=interestExpireTime;
this.timeoutEventHeapLock.lock();
this.mPit.put(interestNameStr,entry);
this.timeoutEventHeap.push(timeEvent);
this.timeoutEventHeap.add(timeEvent);
this.timeoutEventHeapLock.unlock();
this.tryResetTimer();
return false;
@@ -1,51 +0,0 @@
package logicface;
import java.util.LinkedList;
import java.util.List;
/*
* @Author: Wang Feng
* @Description: 超时事件堆
* TODO: Go语言中已经实现好了泛型heap,Java语言需要自己手动实现。要尽量兼顾功能性和高效性。
* @Version: 1.0.0
* @Date: 12:00 2021/4/15
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class TimeoutEventHeap {
public List<TimeoutEvent> 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;
}
}