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

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

相关推荐
学Java的bb12 分钟前
MybatisPlus
java·开发语言·数据库
讓丄帝愛伱13 分钟前
Mybatis Log Free插件使用
java·开发语言·mybatis
重生之我要当java大帝15 分钟前
java微服务-尚医通-编写医院设置接口上
java·数据库·微服务
夫唯不争,故无尤也16 分钟前
Tomcat 内嵌启动时找不到 Web 应用的路径
java·前端·tomcat
心之伊始16 分钟前
Netty线程模型与Tomcat线程模型对比分析
java·开发语言
gaoshan1234567891018 分钟前
‌MyBatis-Plus 的 LambdaQueryWrapper 可以实现 OR 条件查询‌
java·tomcat·mybatis
Mu.38727 分钟前
初始Spring
java·数据库·spring
葡萄城技术团队29 分钟前
突破Excel局限!SpreadJS让电子表格“活”起来
java·数据库·excel
吹个口哨写代码37 分钟前
处理文本编辑器存的json格式报错问题,对编辑器存的字段进行转换处理,再通过json返回
java·编辑器·json
阿挥的编程日记39 分钟前
基于SpringBoot的影评管理系统
java·spring boot·后端