详细讲解线程池的使用

      前言:说起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(); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjzj.html