【线程池】ThreadPoolExecutor应用

ThreadPoolExecutor应用

每一步的坚持与积累,都是铸就高薪和大牛的必经的修炼

哈哈,不吹牛逼了,今天来分享最近在提升 中的学习总结,无论是对在职场 还是求职 ,看完,我相信都会有些许的收获和成长

也难得过了一个悠闲点的周末,哈哈哈,一起奥利给!!

本文总纲:

1.为什么要自定义线程池

原因:

ThreadPoolExecutor中,一共提供了7个参数 ,每个参数都是核心 的属性,在线程池执行任务时,每个参数都有决定性的作用

但是:

在使用JDK提供的方式去构建,可以设置的核心参数最多就2个 ,这样会导致我们对线程池的控制粒度很粗

所以在阿里的规范 中,亦是推荐我们手动 的去new一个ThreadPoolExecutor线程池,并设置他的核心属性

自定义的好处:

  • 可以细粒度 的控制线程池,管理内部的属性
  • 并针对一些参数的设置可能更好的在后期排查问题

ThreadPoolExecutor的七个核心参数

java 复制代码
 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("根据自己的业务情况,自定义一个拒绝策略");
      }

    }

整体应用的代码

java 复制代码
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的源码解析,我会在下一篇进行详细分享介绍!~,敬请期待!!哈哈哈!

道阻且长,行则将至,诸君共勉!

相关推荐
张张张31214 分钟前
4.2学习总结 Java:list系列集合
java·学习
KATA~17 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL33 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing35 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿