您的位置:首页 > 编程语言 > Java开发

读10w定时任务,如何高效触发超时 文章有感 源码

2017-03-20 00:00 274 查看
摘要: 10w定时任务,如何高效触发超时 源码

原文:
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 = 10;
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() {
int curIndex = ai.getAndIncrement()% size;
synchronized (lock) {
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(2000);
testArrive("u123");

} catch (Exception e) {
}

}

private static void testArrive(String uid) {
Integer index = map.get(uid);
if (index == null) {
index = uid.hashCode() % size;
map.put(uid, index);
}
synchronized (lock) {
Set s = uidArr[index];
s.remove(uid);
int  lastIndex = (ai.get()-2) % size;
uidArr[lastIndex].add(uid);
map.put(uid, lastIndex);
logger.info("arrive,uid:{},index:{}", uid, lastIndex);
}

}
}

输出结果:

[时间:2017-03-20 03:04:33] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:0,ele:[]]
[时间:2017-03-20 03:04:34] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:1,ele:[]]
[时间:2017-03-20 03:04:35] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:2,ele:[]]
[时间:2017-03-20 03:04:36] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:arrive,uid:u123,index:1]
[时间:2017-03-20 03:04:36] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:arrive,uid:u456,index:1]
[时间:2017-03-20 03:04:36] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:arrive,uid:u789,index:1]
[时间:2017-03-20 03:04:36] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:3,ele:[]]
[时间:2017-03-20 03:04:37] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:4,ele:[]]
[时间:2017-03-20 03:04:38] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:5,ele:[]]
[时间:2017-03-20 03:04:38] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:arrive,uid:u123,index:4]
[时间:2017-03-20 03:04:39] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:6,ele:[]]
[时间:2017-03-20 03:04:40] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:7,ele:[]]
[时间:2017-03-20 03:04:41] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:8,ele:[]]
[时间:2017-03-20 03:04:42] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:9,ele:[]]
[时间:2017-03-20 03:04:43] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:0,ele:[]]
[时间:2017-03-20 03:04:44] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:1,ele:[u789, u456]]
[时间:2017-03-20 03:04:44] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:超时了:[u789, u456]]
[时间:2017-03-20 03:04:45] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:2,ele:[]]
[时间:2017-03-20 03:04:46] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:3,ele:[]]
[时间:2017-03-20 03:04:47] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:4,ele:[u123]]
[时间:2017-03-20 03:04:47] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:超时了:[u123]]
[时间:2017-03-20 03:04:48] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:5,ele:[]]
[时间:2017-03-20 03:04:49] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:6,ele:[]]
[时间:2017-03-20 03:04:50] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:7,ele:[]]
[时间:2017-03-20 03:04:51] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:8,ele:[]]
[时间:2017-03-20 03:04:52] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:9,ele:[]]
[时间:2017-03-20 03:04:53] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:0,ele:[]]
[时间:2017-03-20 03:04:54] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:1,ele:[]]
[时间:2017-03-20 03:04:55] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:2,ele:[]]
[时间:2017-03-20 03:04:56] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:3,ele:[]]
[时间:2017-03-20 03:04:57] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:4,ele:[]]
[时间:2017-03-20 03:04:58] [级别:INFO] [类:com.tst.timer.HashWheelTimer] [消息:curIndex:5,ele:[]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java