【线程池】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_5470261795 分钟前
Java 中的 Caffeine 缓存详解
java·开发语言·缓存
沐雪轻挽萤17 分钟前
15. C++17新特性-std::string_view
java·开发语言·c++
devilnumber32 分钟前
java的NIO框架Netty、Mina、Grizzly 和 Jetty 四种对比
java·nio·java面试·jetty
努力进修35 分钟前
【java-数据结构】Java优先级队列揭秘:堆的力量让数据处理飞起来
java·开发语言·数据结构
亚历克斯神35 分钟前
Java 代码质量与静态分析:2026 实战指南
java·spring·微服务
@hhr36 分钟前
使用java对接火山方舟doubao-seedance-1.5-pro 模型进行视频生成
java·python·音视频
廋到被风吹走37 分钟前
【LangChain4j】Java 生态中最灵活、功能最强大的纯 Java 大模型应用开发框架(支持声明式@AiService与复杂RAG/Agent)
java·开发语言·python
艾克杏38 分钟前
初学Java之范型
java·开发语言
heartbeat..39 分钟前
java中常用的几种加密方式
java·开发语言
QQ227923910239 分钟前
Java springboot基于微信小程序的智慧旅游导游系统景点门票酒店预订(源码+文档+运行视频+讲解视频)
java·spring boot·微信小程序·maven·vuejs