使用两个ThreadPool
2019独角兽企业重金招聘Python工程师标准>>>
使用ThreadPoolExecutor时,用了两个pool,一大一小;
思路是这样的,任务过来优先使用小池来处理,小池处理不了丢进大池里处理;大池的核心线程数设置为可以回收,以减少资源的占用。
package org.test.thread;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class MyThreadPool {/*** 线程池(大池)*/private static final ThreadPoolExecutor bigPool = new ThreadPoolExecutor(50, 100, 2, TimeUnit.MINUTES,new LinkedBlockingDeque<>(10000),new ThreadPoolExecutor.CallerRunsPolicy());/*** 线程池(小池)*/private static final ExecutorService smallPool = new ThreadPoolExecutor(25, 50, 5, TimeUnit.MINUTES,new LinkedBlockingDeque<>(100),new RunsInBigPoolPolicy());private static Logger logger = LoggerFactory.getLogger(MyThreadPool.class);static {//大池的核心线程数可以被回收bigPool.allowCoreThreadTimeOut(true);}/*** 异步执行** @param runnable*/public static void execute(Runnable runnable) {if (runnable == null) {return;}if (smallPool != null && !smallPool.isShutdown()) {smallPool.execute(runnable);} else if (bigPool != null && !bigPool.isShutdown()) {bigPool.execute(runnable);} else {runnable.run(); //主线程直接调用logger.error("线程池异常,主线程直接执行了任务...");}}/*** <br>任务运行在大池里的策略</br>* 由于CallerRunsPolicy会造成主线程阻塞,所以把小池处理不了的任务丢到大池里执行;*/public static class RunsInBigPoolPolicy implements RejectedExecutionHandler {public RunsInBigPoolPolicy() {}@Overridepublic void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) {if (runnable == null) {return;}if (bigPool != null && !bigPool.isShutdown()) {bigPool.execute(runnable);logger.warn("a task is switched into big pool...");} else {runnable.run(); //主线程直接调用logger.error("线程池异常,主线程直接执行了任务...");}}}
}
转载于:https://my.oschina.net/placeholder/blog/1583708
使用两个ThreadPool相关推荐
- 【学海无涯】Java成神之路
基础篇 面向对象 面向对象与面向过程 面向过程就是按照程序进行的顺序依次编写索要完成相应任务的方法,依次调用.面型对象注重对逻辑概念的封装,将若干变量和方法封装成类,各个对象互相调用.面向对象占用 ...
- Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...
- ThreadPool基础之RegisterWaitForSingleObject
首先我们看一下它的原型: public static RegisteredWaitHandle RegisterWaitForSingleObject( WaitHandle waitObj ...
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...
- 利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma
该案例展示了如何利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma. 在执行本案例前,需要确保正确安装sklearn,以保证SVM部分的代码能够正常执行. 本函数需要用到一个外部数据 ...
- 线程池ThreadPool知识碎片和使用经验速记
ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...
- boost之ThreadPool
boost之ThreadPool 标签: threadcallback任务lockingexceptionfunction 2011-04-02 17:59 22258人阅读 评论(3) 收藏 举报 ...
- C# ThreadPool类(线程池)
地址:https://www.cnblogs.com/scmail81/archive/2018/08/19/9503266.html CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要 ...
最新文章
- shelve 序列化模块——day18
- xmind工具软件(相关)
- [No000011B]为什么有些程序员悄无声息渡过35岁中年危机?
- spring boot中利用mybatis-generator插件生成代码
- 运行在 SAP Kyma 上一个 pod 的明细信息
- 计算机专业能用ipad吗,iPad 能不能代替电脑?说说我这 3 个月的使用体验
- Linux eBPF 程序构成与通信原理
- matlab转dsp软件,matlab/simulink程序代写 DSP程序开发
- JQuery处理元素尺寸和浏览器窗口尺寸
- 【SSM框架项目 客户关系管理系统CRM 学习开发 Day3】市场活动模块的数据导入与导出
- 热点信号放大(WISP)、万能中继(Client+AP)+AP
- 一键获取lazada商品评论
- word中,去表格格式,把表格转换为文本的方法
- 《unix环境高级编程》--- 终端I/O
- NetCDF数据处理
- NetSuite SuiteQL Query Tool
- 基于人本理念的绩效管理体系设计(一)
- mmap在嵌入式中的应用
- Java趣味问答题^_^
- 筛查以jpg结尾的图片python_关于image:正则表达式,用于检查以.jpg,.png或.gif结尾的有效网址...