常见线程池之 newCacheThreadPool 缓存线程池 简单使用
2024-09-05 11:49:05
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());
}
}
看下结果
让线程睡一会
最新文章
- 为什么DOM操作很慢
- jq倒计时(代码)
- Windows 安装 openssl
- React.js 是什么?
- javascript小练习—函数接收参数并弹出
- Aspx 页面生命周期
- cocos2d-x-lua基础系列教程三(lua面向对象)
- JavaEE:Eclipse开发工具的相关使用和XML技术
- sipcal
- android usb挂载分析
- Python初识--基础
- 如何配置springboot一访问服务器本地图片
- .net momeryStream 读取为空问题
- Vue组件的使用
- Linq分组查询统计
- NTFS的交换数据流ADS应用
- flume-ng-sql-source实现oracle增量数据读取
- day08-MySQl创建用户和授权
- JavaScript学习总结(七)——JavaScript函数(function)
- NOIP2015普及组T4推销员(暴力+线段树)
热门文章
- Revolving Digits(hdu4333)
- Wiener Filtering
- [opencv]Rect集合象限法分类聚合 函数
- CS5211替代CH7511B|设计DP转LVDS转接板|替代CH7511B
- Vue.js高效前端开发 • 【Vue基本指令】
- Log4j2完整XML参考(详细注释说明)
- [学习笔记] IT项目管理 - 挣值管理(EVM)
- Pytest_在jenkins中使用allure报告(13)
- minio实现文件上传下载和删除功能
- java 使用 ArrayList 排序【包括数字和字符串】