常见线程池之 newCacheThreadPool 缓存线程池 简单使用
package com.aaa.threaddemo; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy; /*
一 常见线程池之
* newCachedThreadDemo
* 1 可以根据需要创建新的线程的线程池
* 2 旧的线程可用时,将重用他们。 第一个任务完成,第二个任务会复用第一个线程,不会新建线程
* 3 当旧的线程不可用时,才会创建新的线程。 终止并且从缓存中移除 60秒未使用的线程
* 4 所有该线程就算长时间保持空闲,也不会使用任何资源
* 5 任何任务来了就能执行,不需要等待
*
* 场景?
* 对于执行 许多短期异步的程序。
* 大量,耗时少的任务
* 可以提高效率
*
二 真实的 newCacheThreadPool()
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(
0, //核心线程数量 0
Integer.MAX_VALUE, //最大线程数量时Integer型的最大值,是2147483647。
60L, //非核心线程生存时间 60秒
TimeUnit.SECONDS, //空闲时间单位 秒
new SynchronousQueue<Runnable>()); //等待队列 SynchronousQueue
} 三 SynchronousQueue 队列是个啥?
1.是阻塞队列 BlockingQueue 的一种,所以线程上是安全的
2.SynchronousQueue的容量是0,不存储任何元素
3.更是在线程之间移交任务 在两个线程之间传递同一个对象
当有item 来的时候, insert操作。需要等待其他线程来接收。其他线程做remove操作。
当删除 item, remove操作,也是一样的。 四 拒绝策略 默认的 AbortPolicy。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
} private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();
和它相关的任务 都不执行 线程池默认的拒绝方式
*
*/
public class CachedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService cachePool = Executors.newCachedThreadPool(); //创建可以缓存的线程池 //来6个线程试一下
CacheThread cacheThread = new CacheThread();
CacheThread cacheThread2 = new CacheThread();
CacheThread cacheThread3 = new CacheThread();
CacheThread cacheThread4 = new CacheThread();
CacheThread cacheThread5 = new CacheThread();
CacheThread cacheThread6 = new CacheThread(); cachePool.execute(cacheThread);
cachePool.execute(cacheThread2);
cachePool.execute(cacheThread3);
cachePool.execute(cacheThread4);
cachePool.execute(cacheThread5);
cachePool.execute(cacheThread6); Runnable task = new Runnable() {
public void run() {
System.out.println("new 一个 runnable接口, 实现多线程");
System.out.println("当前执行线程的名字" + Thread.currentThread().getName());
}
}; cachePool.execute(task); //线程池中执行任务 cachePool.shutdown(); //渐进式的关闭线程池
}
} class CacheThread extends Thread{
@Override
public void run() {
System.out.println("当前执行线程的名字" + Thread.currentThread().getName());
}
}
看下结果

让线程睡一会

常见线程池之 newCacheThreadPool 缓存线程池 简单使用的更多相关文章
- 8、java5线程池之动态缓存线程池newCachedThreadPool
JDK文档描述 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能.调用 execute 将重用以前构造的线程 ...
- 阿里开源支持缓存线程池的ThreadLocal Transmittable ThreadLocal(TTL)
功能 在使用线程池等会缓存线程的组件情况下,提供ThreadLocal值的传递功能. JDK的InheritableThreadLocal类可以完成父子线程值的传递. 但对于使用线程池等会缓存线程的组 ...
- Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解.[size=1.8em]Handler+Runna ...
- 【转】Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
http://www.cnblogs.com/wanqieddy/archive/2013/09/06/3305482.html android线程池的理解,晚上在家无事 预习了一下android异步 ...
- 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解. [size=1.8em]Handler+Runn ...
- [Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解. [size=1.8em]Handler+Runn ...
- (CSDN 迁移) JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)
在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).下面介绍的是第三种newCachedThreadPo ...
- cachedThreadPool缓存线程池
package com.loan.modules.common.util; import java.util.concurrent.BlockingQueue; import java.util.co ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
随机推荐
- Polyomino Composer(UVA12291)
Description Polyomino Composer A polyomino is a plane geometric figure formed by joining one or m ...
- 教你Python字符串的基本操作:拆分和连接
摘要:由于字符串数据几乎无处不在,因此掌握有关字符串的交易工具非常重要.幸运的是,Python 使字符串操作变得非常简单,尤其是与其他语言甚至旧版本的 Python 相比时. 本文分享自华为云社区&l ...
- [opencv]求像素范围中最大值与最小值
double minv = 0.0, maxv = 0.0; double* minp = &minv; double* maxp = &maxv; minMaxIdx(channel ...
- 美和易思 MOOT去鼠标检测,快进,倍速,自动下一章
F12 放到 console 直接运行即可 或者油猴添加新脚本 核心去除网页绑定焦点事件代码: if (!-[1,] && !window.XMLHttpRequest || navi ...
- 编写Java程序随机输入日期计算星期几,打印任意一年的日历
需求说明: 随机输入日期计算星期几,打印任意一年的日历 已知,1900年1月1日是星期1,用户随机输入年月日,计算星期几 实现思路: 一.知道1900年1月1日为星期一,求输入的年份月份与1900年1 ...
- 开源社区Review代码步骤
以Ranger项目为例,说明开源社区Review代码详细步骤. 1.寻找合适的issue进行review 首先自己需要是某个开源项目的committer, 要有合入代码的权限. 2.review代码 ...
- CSS基础 列表相关的属性的使用
1.无序列表:就是不需要排列顺序的情况,用无序列表 语法结构:<ul> <li></li> <li></li> </ul> 特点 ...
- 通过js触发launch事件获取页面信息
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814776265602499080/ 承接上一篇文档<页面Cookie的JS文件编写> 思路 继续之前 ...
- CentOS6.9部署Redis3.2.9+FastDFS_4.06+Nginx1.5.0
CentOS6.9部署Redis3.2.9+FastDFS_4.06+Nginx1.5.0 原文链接:https://www.toutiao.com/i6481931577499582990/ 一.上 ...
- 通过springBoot集成搭建webScoket服务器
前言: 最近工作中有一个需求,就是服务端要主动推送消息给客户端,而我们平常的Http请求只能一请求一响应,为此学习了webScokset通讯技术,以下介绍的是java 通过SpringBoot集成we ...