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

本文介绍了一种基于HashWheel的定时器实现思路,通过使用HashSet、ConcurrentHashMap和ScheduledExecutorService等Java并发工具,实现了任务调度和超时检查机制。文章详细展示了定时器的初始化过程、定时任务的周期性执行以及如何处理到达的任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文: 

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:[]

转载于:https://my.oschina.net/u/3025651/blog/863098

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值