异步线程池
2016-02-29 14:26
351 查看
异步线程池
测试:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class AsyncThreadUtil { private final static Logger logger = LoggerFactory.getLogger(AsyncThreadUtil.class); private static final int corePoolSize = Runtime.getRuntime().availableProcessors() * 50; // 按进程数 * 50 private static final int maxPoolSize = corePoolSize * 2; private static final int maxQueueSize = maxPoolSize * 10; /** * 平均每秒任务数量 * 平均执行等待秒数 / 平均可接受任务处理秒数 * <p> * 假设每秒1000个任务 */ private static final ExecutorService executorService = new ThreadPoolExecutor( corePoolSize, maxPoolSize, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(maxQueueSize), new CustomRejectedPolicy()); public static void execute(Runnable command) { executorService.execute(command); } public static <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) { try { return executorService.invokeAll(tasks); } catch (InterruptedException e) { throw new RuntimeException(e); } } public static <T> Future<T> submit(Callable<T> task) { return executorService.submit(task); } public static void shutdown() { try { executorService.shutdown(); } catch (Exception e) { logger.error(e.getMessage(), e); } } public static int getQueueSize() { return ((ThreadPoolExecutor) executorService).getQueue().size(); } private static class CustomRejectedPolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { logger.info("executorService reject execute: {}", r.getClass().getName()); if (!executor.isShutdown()) { try { Thread.sleep(100); } catch (InterruptedException e) { logger.error("thread errpr.",e); } executor.execute(r); } } } }
测试:
public static void main(String[] args) { AsyncThreadUtil.execute(new Runnable() { @Override public void run() { // TODO do something } }); }
相关文章推荐
- 使用AndroidStudio分析和解决ImageLoader引起OOM问题
- 使用wireshark常用的过滤命令
- linux(ubuntu)安装jdk
- 使用Python绘制Nginx,Redis等的性能测试图表
- getwidth和getmeasuredwidth的区别
- 集合框架
- MyBatis持久化框架
- 点击发送后图片查看大图的实现思路
- 技术领导要不要写代码?
- Cesium.js 加载3D模型
- 离屏渲染学习笔记
- WCF简介
- 23种设计模式(17):备忘录模式
- OpenCV学习之阈值化
- SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改
- springMVC+Java验证码完善注册功能
- Android - BroadcastRecevier
- redis学习
- jspwiki-2.10.1的权限配置与使用
- cesium 中地图发生了平移,放缩,旋转等动作所要执行的动作