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{
@Override
public 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() {
@Override
public 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>() {
@Override
public Object call() throws Exception {
System.out.println("我有返回结果");
return "你好,线程池!~";
}
});
Object result = future.get();
System.out.println(result);
//如果是局部变量的线程池,记得用完要用shutdown
poolExecutor.shutdown();
}
private static class MyRejectExecution implements RejectedExecutionHandler{
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("根据自己的业务情况,自定义一个拒绝策略");
}
}
}
OK,完结撒花
本篇主要介绍
ThreadPoolExecutor
的应用和基础知识
对于ThreadPoolExecutor
的源码解析,我会在下一篇进行详细分享介绍!~,敬请期待!!哈哈哈!