【线程池】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的源码解析,我会在下一篇进行详细分享介绍!~,敬请期待!!哈哈哈!

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

相关推荐
qq_124987075324 分钟前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_29 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.30 分钟前
Day06——权限认证-项目集成
java
瑶山33 分钟前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy40 分钟前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_8187320642 分钟前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
2501_941982051 小时前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信
马猴烧酒.1 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
sino爱学习2 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端
风生u2 小时前
activiti7 详解
java