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

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

相关推荐
月阳羊2 分钟前
【硬件-笔试面试题-95】硬件/电子工程师,笔试面试题(知识点:RC电路中的时间常数)
java·经验分享·单片机·嵌入式硬件·面试
Bigemap6 分钟前
BigemapPro快速添加历史影像(Arcgis卫星地图历史地图)
java·开发语言
IT学长编程10 分钟前
计算机毕业设计 基于Hadoop的健康饮食推荐系统的设计与实现 Java 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
java·大数据·hadoop·毕业设计·课程设计·推荐算法·毕业论文
hrrrrb18 分钟前
【Python】字符串
java·前端·python
mkhase26 分钟前
9.12-QT-基本登陆界面实现
java·jvm·qt
yinke小琪29 分钟前
说说hashCode() 和 equals() 之间的关系
java·后端·面试
若鱼191932 分钟前
Kafka如何配置生产者拦截器和消费者拦截器
java·kafka
渣哥37 分钟前
Java 自适应自旋锁机制详解:原理、优缺点与应用场景
java
摇滚侠1 小时前
java语言中,list<String>转成字符串,逗号分割;List<Integer>转字符串,逗号分割
java·windows·list
烽学长1 小时前
(附源码)基于Spring Boot的宿舍管理系统设计
java