前言:说起threadpoolexector应该大家多少都接触过,现在我详细的讲解下其的用法
一:解析参数为了更好地理解threadpoolexecutor,我先讲一个例子,话说一个工作多年的高T,一天突然决定自己要单干组织一个团队,经过仔细的考虑他做出了如下的决定
1、团队的核心人员为10个
2、如果一旦出现项目过多人员不足的时候,则会聘请5个外包人员
3、接的项目单子最多堆积100
4、如果项目做完了团队比较空闲,则裁掉外包人员,空闲的时间为一个月
5、如果接的单子超过100个,则后续考虑一些兜底策略(比如拒绝多余的单子,或者把多出100个以外的单子直接交付第三方公司做)
6、同时他还考虑了如果效益一直不好,那么就裁掉所有人,宣布公司直接倒闭
上面的例子恰恰和我们的线程池非常的像,我们来看下threadpoolexecutor的定义。
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler);
corePoolSize:核心线程数(就是我们上面说的一个公司核心人员)
maximumPoolSize:最大线程数(就是我们说的一旦公司接收的单子过多则聘请外包,此时也是公司最大的人员了,因为人多了办公地方不够了)
keepAliveTime:超多核心线程数之外线程的存活时间(就是如果公司一旦活不多要多久进行裁掉外包人员)
unit:上面时间的单元(可以年月日时分秒等)
workQueue:任务队列(就是如果公司最大能存的单子)
handler:拒绝策略(就是一旦任务满了应该如果处理多余的单子)
allowCoreThreadTimeOut:设置是否清理核心线程(如果设置true,如果任务少于实际执行的线程则会清理核心线程,默认为false)
二:实际演练先验证核心线程数
public class ThreadPoolExecutorTest { public static void main(String[] args) throws InterruptedException { RejectedExecutionHandler handler = new RejectedExecutionHandlerImpl(); ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 20L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(9)); for (int i = 0; i < 11; i++) { AppTask appTask = new AppTask(i); poolExecutor.execute(appTask); System.out.println("线程池中线程的数目:" + poolExecutor.getPoolSize() + ",线程池中等待的队列数目:" + poolExecutor.getQueue().size() + ";线程池中已执行完毕的任务数据:" + poolExecutor.getCompletedTaskCount()); } poolExecutor.allowCoreThreadTimeOut(true); if (!poolExecutor.isShutdown()) { poolExecutor.shutdown(); } } static class AppTask implements Runnable { private int taskNum; public AppTask(int num) { this.taskNum = num; } @Override public void run() { try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"_task_" + this.taskNum + ":执行完毕"); } } static LinkedBlockingQueue<Runnable> xs = new LinkedBlockingQueue(10000); static int i = 0; static class RejectedExecutionHandlerImpl implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try { xs.put(r); } catch (InterruptedException e) { e.printStackTrace(); } } }