newCachedThreadPool 的使用
newCachedThreadPool的线程池特点:
(1)它是一个可以无限扩大的线程池;它比较适合处理执行时间比较小的任务;corePoolSize为0,maximumPoolSize为无限大,意味着线程数量可以无限大;keepAliveTime为60S,意味着线程空闲时间超过60S就会被杀死;采用SynchronousQueue装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理他,如果当前没有空闲的线程,那么就会再创建一条新的线程。
(2)如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
可以看出该线程池会复用空闲的线程,从而减少创建对象和回收对象带来开销。
项目中用到了newCachedThreadPool,查了一下,为啥用这个:
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCityAsyncClient.class); private static final int QUEUE_SIZE = 10000; private static final int WORKER_COUNT = 8; private static final ThreadGroup THREAD_GROUP = new ThreadGroup("cityAsyncClientThrceadGroup"); private static final ExecutorService EXECUTOR_SERVICE = Executors.newCachedThreadPool(new ThreadFactory() { private final AtomicInteger threadNumber = new AtomicInteger(1); @Override public Thread newThread(Runnable r) { return new Thread(THREAD_GROUP, r, "cityAsyncClient-thread-pool-" + threadNumber.getAndIncrement()); } }); @Override public void asyncExecRequest(CityRequest cityRequest) { String name = cityRequest.getName(); BlockingQueue<CityRequest> blockingQueue = requestQueueMap.get(name); if (blockingQueue == null) { synchronized (requestQueueMap) { /* double check */ blockingQueue = requestQueueMap.get(name); if (blockingQueue == null) { blockingQueue = new ArrayBlockingQueue<>(QUEUE_SIZE); requestQueueMap.put(name, blockingQueue); for (int i = 0; i < WORKER_COUNT; i++) { EXECUTOR_SERVICE.execute(new Worker(this, blockingQueue)); } } } } try { if (!blockingQueue.offer(cityRequest, 10L, TimeUnit.MILLISECONDS)) { execRequest(cityRequest); } } catch (InterruptedException e) { LOGGER.error("{}.asyncExecRequest error.", this.getClass().getSimpleName(), e); } }
之所以要用到newCachedThreadPool的原因是:
主要是考虑到了(a)如果线程池超过长度,可以灵活回收空闲线程,若无可回收,则新建线程,。因为车辆定位信息可能有时候多,有时候少,考虑到复用性的问题,如果线程闲置的话,可以复用。减少损耗系统资源。
(b )它比较适合处理执行时间比较小的任务;我们的任务到了一定上线就会及时处理。(数量1000,等待时间 5000毫秒,也就是说,不管数据过来多少,只要到了1000条或者5秒就发送)
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/p/10731108.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-04-18 sleep、yield、wait、join的区别(阿里)