mirror of
https://gitee.com/willfree/min-dev-java.git
synced 2026-10-04 19:42:01 +08:00
use PriorityBlockingQueue to implements TimeoutEventHeap
This commit is contained in:
1 parent
c48ff6652f
commit
212d9638c4
2 files changed
+20
-62
No files matched your search
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user