原文:
http://mp.weixin.qq.com/s/mvFwjgxliwx808Hn_9ruEA
58沈老师写的一个不错的思路
只有实现思路 没有代码 因此写出代码 不足之处 请大家指教
package com.tst.timer;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HashWheelTimer {
private final static Logger logger = LoggerFactory.getLogger(HashWheelTimer.class);
private static AtomicInteger ai = new AtomicInteger(0);
private static int size = 11;
private static Map<String, Integer> map = new ConcurrentHashMap<>();
private static Set[] uidArr = new Set[size];
private ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
private static Object lock=new Object();
public HashWheelTimer() {
for (int i = 0; i < size; i++) {
Set set = new HashSet();
uidArr[i]=set;
}
pool.scheduleAtFixedRate(new Runnable() {
public void run() {
synchronized (lock) {
int curIndex = ai.getAndIncrement()% size;
logger.info("curIndex:{},ele:{}", curIndex, uidArr[curIndex]);
Set s = uidArr[curIndex];
if (s != null && s.size() > 0) {
logger.info("超时了:{}", s);
s.clear();
}
}
}
}, 0, 1, TimeUnit.SECONDS);
}
public static void main(String[] args) {
try {
new HashWheelTimer();
Thread.sleep(3000);
testArrive("u123");
testArrive("u456");
testArrive("u789");
Thread.sleep(5000);
testArrive("u123");
} catch (Exception e) {
}
}
private static void testArrive(String uid) {
synchronized (lock) {
Integer index =ai.get()%size;
logger.info("-- arrive index:{}",index);
if(map.get(uid)!=null){
Integer oldIndex=map.get(uid);
Set s = uidArr[oldIndex];
s.remove(uid);
}
int lastIndex = (index-1);
uidArr[lastIndex].add(uid);
map.put(uid, lastIndex);
logger.info("arrive,uid:{},last index:{}", uid, lastIndex);
}
}
}
输出结果:
2018-08-14 17:51:39.400 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:0,ele:[]
2018-08-14 17:51:40.369 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:1,ele:[]
2018-08-14 17:51:41.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:2,ele:[]
2018-08-14 17:51:42.367 [main] INFO
c.q.springwebtest.HashWheelTimer - -- arrive index:3
2018-08-14 17:51:42.368 [main] INFO
c.q.springwebtest.HashWheelTimer - arrive,uid:u123,last index:2
2018-08-14 17:51:42.368 [main] INFO
c.q.springwebtest.HashWheelTimer - -- arrive index:3
2018-08-14 17:51:42.368 [main] INFO
c.q.springwebtest.HashWheelTimer - arrive,uid:u456,last index:2
2018-08-14 17:51:42.368 [main] INFO
c.q.springwebtest.HashWheelTimer - -- arrive index:3
2018-08-14 17:51:42.369 [main] INFO
c.q.springwebtest.HashWheelTimer - arrive,uid:u789,last index:2
2018-08-14 17:51:42.369 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:3,ele:[]
2018-08-14 17:51:43.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:4,ele:[]
2018-08-14 17:51:44.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:5,ele:[]
2018-08-14 17:51:45.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:6,ele:[]
2018-08-14 17:51:46.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:7,ele:[]
2018-08-14 17:51:47.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:8,ele:[]
2018-08-14 17:51:47.369 [main] INFO
c.q.springwebtest.HashWheelTimer - -- arrive index:9
2018-08-14 17:51:47.376 [main] INFO
c.q.springwebtest.HashWheelTimer - arrive,uid:u123,last index:8
2018-08-14 17:51:48.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:9,ele:[]
2018-08-14 17:51:49.370 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:10,ele:[]
2018-08-14 17:51:50.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:0,ele:[]
2018-08-14 17:51:51.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:1,ele:[]
2018-08-14 17:51:52.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:2,ele:[u789, u456]
2018-08-14 17:51:52.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - 超时了:[u789, u456]
2018-08-14 17:51:53.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:3,ele:[]
2018-08-14 17:51:54.371 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:4,ele:[]
2018-08-14 17:51:55.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:5,ele:[]
2018-08-14 17:51:56.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:6,ele:[]
2018-08-14 17:51:57.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:7,ele:[]
2018-08-14 17:51:58.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:8,ele:[u123]
2018-08-14 17:51:58.368 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - 超时了:[u123]
2018-08-14 17:51:59.373 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:9,ele:[]
2018-08-14 17:52:00.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:10,ele:[]
2018-08-14 17:52:01.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:0,ele:[]
2018-08-14 17:52:02.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:1,ele:[]
2018-08-14 17:52:03.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:2,ele:[]
2018-08-14 17:52:04.367 [pool-1-thread-1] INFO
c.q.springwebtest.HashWheelTimer - curIndex:3,ele:[]