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 ...
随机推荐
- 避免Linux上错删文件
前言 在linux上我们常见的问题就是一个操作不小心误删除文件,而且在linux想要恢复文件没这么简单.只有当每次删除之后才后悔莫及,参考windows中最常见的做法就是给系统装一个回收站,让每次删除 ...
- TensorFlow实现XOR
TensorFlow基础 1.概念 TF使用图表示计算任务,图包括数据(Data).流(Flow).图(Graph) 图中节点称为op,一个op获得多个Tensor Tensor为张量,TF中用到的数 ...
- 制作联动时,数据绑定combox控件会触发SelectedIndexChanged事件
看过很多个网站的解决办法,基本雷同,还不能解决,真怀疑他们是互相直接炒的,没事通过验证. 在做省市区的三级联动时候出现这个问题,最后通过先设置值对象和显示对象,最后才绑定数据,这样一个逻辑操作,什么问 ...
- 【CSS学习】--- 字体样式
一.前言 CSS字体属性可以定义文本的字体系列.大小.加粗.颜色.风格(如斜体)和变形(如小型大写字母). CSS的字体属性: font-family 设置字体系列 font-size 设置字体的尺寸 ...
- Dynamics 365中的批量删除作业执行频率可以高于每天一次吗?
微软动态CRM专家罗勇 ,回复317或者20190314可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我先来做一个例子,登 ...
- SVN的使用说明
SVN管理版本是比较好的东西,但是我的SVN图标老是不出来,有时候莫名其妙就没有了,所以记录一下处理办法: 1.右键->TortoiseSVN->Settings->Icon Ove ...
- 一起学Android之GridView
本文以一个简单的小例子,简述Android开发中GridView的常见应用,仅供学习分享使用. 概述 GiridView是一个表格显示资源的控件,可以在两个可滚动的方向上显示.列表项的资源会通过Lis ...
- Win10系统下装Ubuntu虚拟机的遇到的问题总结
环境和工具 win10操作系统 VMware Workstation 12 Ubuntu 14.0 64位 教程可参考:VMware Ubuntu安装详细过程(非常靠谱) [因为我的安装过程不是十分顺 ...
- BASE64编码的图片在网页中的显示问题的解决
BASE64位转码有两种: 一种是图片转为Base64编码,这种编码是直接可以在页面通过<img src='base64编码'/>的方式显示 Base64 在CSS中的使用 .demoIm ...
- SQL学习笔记---非select操作
非select命令 数据库 1.创建 //create database 库名 2.删除 //drop database 库名,... 2.重命名//exec sp_renamedb ...