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 = ;
private static final int WORKER_COUNT = ;
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();
@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 = ; 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秒就发送)
newCachedThreadPool 的使用的更多相关文章
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- java程序设计线程池(newCachedThreadPool())
创建一个无界的可缓存的线程池,若线程长时间没用会自动销毁,直接上代码好了: import java.util.concurrent.ExecutorService; import java.util. ...
- newCachedThreadPool线程池
public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任 ...
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...
- java 线程池 ---- newCachedThreadPool()
class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...
- 线程池工厂方法newFixedThreadPool()和newCachedThreadPool()
newFixedThreadPool()方法: 该方法返回一个固定数量的线程池,当一个新的任务提交时,线程池中若有空闲线程,则立即执行. 若没有.则新的任务被暂存在一个任务队列中,待线程空闲时,便处理 ...
- 009-ThreadPoolExecutor运转机制详解,线程池使用1-newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool
一.ThreadPoolExecutor理解 为什么要用线程池: 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务. 2.可以根据系统的承受能力,调整线程池中工作线线程的数 ...
- 多线程——newCachedThreadPool线程池
newCachedThreadPool线程池: 理解: 1).newCachedThreadPool可以创建一个无限大小的线程池(实际上是一个可缓存线程池). 可以通过Executors的静 ...
- newCachedThreadPool使用案例
newCachedThreadPool 缓存默认60s 猜下你的结果 package com.juc.threadpool; import java.util.concurrent.ExecutorS ...
随机推荐
- 带你精读你不知道的Javasript(上)(一)
斌果在这几天看了下你不知道的js这本书,这本书讲的东西还是挺不错的,其中有很多平时我压根没接触到的概念和方法.借此也可以丰富一下我对js的了解. 第一部分 第一章 作用域是什么? 1.程序中一点源代码 ...
- Java集合必会14问(精选面试题整理)
前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没 ...
- Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档
前言 目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对于开发人员来说,编写接口文档 ...
- Windows系统pip安装whl包
1.确保PIP的存在 2.CMD命令进入C:\Python34\Scripts里面后再执行PIP命令安装pip install wheel # D: 和cd 地址 3.把文件最好放在\S ...
- Java并发专题(三)深入理解volatile关键字
前言 上一章节简单介绍了线程安全以及最基础的保证线程安全的方法,建议大家手敲代码去体会.这一章会提到volatile关键字,虽然看起来很简单,但是想彻底搞清楚需要具备JMM.CPU缓存模型的知识.不要 ...
- [SpringBoot guides系列翻译]通过JDBC和Spring访问关系数据库
原文 参考链接 hikaricp Spring Boot JDBC Starter Spring Boot Starter Parent h2 database introduction Autowi ...
- c# 正则表达式替换字符串中常见的特殊字符
第一种,若字符串中含有字母,则使用以下方法 public static string RemoveSpecialCharacterToupper(string hexData) { //下文中的‘\\ ...
- 用JS在html页面实现打印功能
首先在head里面加入下面一段js代码: <script language="javascript"> function preview(oper) { if (ope ...
- arcgis api 3.x for js 入门开发系列二十一气泡窗口信息动态配置模板
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- JVM内存结构,运行机制
三月十号,白天出去有事情出去了一天,晚上刚到食堂就接到阿里电话, 紧张到不行,很多基础的问题都不知道从哪里说了orz: 其中关于JVM内存结构,运行机制,自己笔记里面有总结的,可当天还是一下子说不出来 ...