ThreadPoolExecutor应用
每一步的坚持与积累,都是铸就高薪和大牛的必经的修炼
哈哈,不吹牛逼了,今天来分享最近在提升中的学习总结,无论是对在职场还是求职,看完,我相信都会有些许的收获和成长
也难得过了一个悠闲点的周末,哈哈哈,一起奥利给!!
本文总纲:
1.为什么要自定义线程池
原因:
在
ThreadPoolExecutor
中,一共提供了7个参数,每个参数都是核心的属性,在线程池执行任务时,每个参数都有决定性的作用但是:
在使用
JDK
提供的方式去构建,可以设置的核心参数最多就2个,这样会导致我们对线程池的控制粒度很粗所以在阿里的规范中,亦是推荐我们手动的去
new
一个ThreadPoolExecutor
线程池,并设置他的核心属性自定义的好处:
- 可以细粒度的控制线程池,管理内部的属性
- 并针对一些参数的设置可能更好的在后期排查问题
ThreadPoolExecutor
的七个核心参数
public ThreadPoolExecutor(int corePoolSize, //核心工作线程:(当前任务结束后,不会被销毁)int maximumPoolSize,//最大工作线程(代表当前工作线程池中,一共可以有多少个工作线程)long keepAliveTime, //非核心工作线程在阻塞队列位置等待的时间TimeUnit unit, //非核心工作线程在阻塞队列位置等待的时间的单位BlockingQueue<Runnable> workQueue,//任务在没有核心工作线程处理时,任务线扔到阻塞队列中ThreadFactory threadFactory, //构建线程的线程工作,可以设置Thread的一些信息RejectedExecutionHandler handler //当线程池无法处理投递过来的任务时,执行当前的拒绝策略) {
2.ThreadPoolExecutor
的应用
手动
new
一下,处理方式还是执行execute
或者submit
方法
JDK提供的几种拒绝策略
AbortPolicy
:当前拒绝策略在无法处理任务时,会抛出异常
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {throw new RejectedExecutionException("Task " + r.toString() +" rejected from " +e.toString());
}
CallerRunsPolicy
:当前拒绝策略会在线程池无法处理任务时,将任务交给调用者自己去处理
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {if (!e.isShutdown()) {r.run();}
}
DiscardPolicy
:当前拒绝策略会在线程池无法处理任务时,直接将任务丢弃掉
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
DiscardOldestPolicy
:当前拒绝策略会在线程池无法处理任务时,将队列中最早的任务丢弃掉,将当前任务再次尝试提交给线程池处理
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {if (!e.isShutdown()) {e.getQueue().poll();e.execute(r);}
}
- 自定义
Policy
:根据自己的业务,可以将任务扔到数据库,也可以进行其他的操作
private static class MyRejectExecution implements RejectedExecutionHandler{@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println("根据自己的业务情况,自定义一个拒绝策略");}
}
整体应用的代码
import java.util.concurrent.*;public class ThreadPool_Individual {/**** @param args*/public static void main(String[] args) throws ExecutionException, InterruptedException {//1.构建线程池ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2,5,10,TimeUnit.SECONDS,new ArrayBlockingQueue<>(10),new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setName("测试ThreadPoolExecutor");return thread;}},new MyRejectExecution());//2.让线程池处理任务,没有返回结果poolExecutor.execute(()->{System.out.println("没有返回结果的任务");});//3.让线程池处理有返回结果的任务Future<Object> future = poolExecutor.submit(new Callable<Object>() {@Overridepublic Object call() throws Exception {System.out.println("我有返回结果");return "你好,线程池!~";}});Object result = future.get();System.out.println(result);//如果是局部变量的线程池,记得用完要用shutdownpoolExecutor.shutdown();}private static class MyRejectExecution implements RejectedExecutionHandler{@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println("根据自己的业务情况,自定义一个拒绝策略");}}
}
OK,完结撒花
本篇主要介绍
ThreadPoolExecutor
的应用和基础知识
对于ThreadPoolExecutor
的源码解析,我会在下一篇进行详细分享介绍!~,敬请期待!!哈哈哈!