首页 > 其他分享 >自定义线程池

自定义线程池

时间:2023-02-21 14:12:41浏览次数:53  
标签:线程 自定义 static new public ThreadPoolExecutor

线程池的基础知识

如果不了解线程池,可以先看一下基础知识。
详情见: https://www.cnblogs.com/expiator/p/9053754.html

线程数的设置

详情见: https://www.cnblogs.com/expiator/p/17087726.html

为什么要自定义线程池

由于Executors.newCachedThreadPool()最大线程数设置为最大的Integer.MAX_VALUE,如果最大线程数maximumPoolSize达到最大,那么会导致OOM异常。

而Executors.newFixedThreadPool(),使用的LinkedBlockingQueue()是一个无界队列,队列长度可达到Integer.MAX_VALUE,如果瞬间请求非常大,会有OOM的风险。

使用自定义线程池ThreadPoolExecutor,可以控制最大线程数、阻塞队列长度,避免OOM。

自定义线程池

参数ThreadFactory threadFactory,创建线程或线程池时指定有意义的线程名称,方便出错时回溯。

public class ThreadPoolUtil {


    public static ThreadPoolExecutor EXECUTOR ;

    /**
     * 自定义线程池,初始化
     */
    static {
        initExecutor();
    }

    /**
     * 自定义线程池,初始化
     */
    public static void initExecutor() {
        //参数可以写到配置里面,更加灵活
        //核心线程数
        int corePoolSize = 20;
        //最大线程数
        int maximumPoolSize = 200;
        //存活时间及单位
        long keepAliveTime = 2;
        TimeUnit timeUnit = TimeUnit.SECONDS;
        //阻塞队列长度
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);

        //创建线程或线程池时指定有意义的线程名称,方便出错时回溯。
        ThreadFactory threadFactory = new ThreadFactoryBuilder()
                .setNameFormat("demo-pool-%d").build();
        //可以自定义拒绝策略,也可以不加这个参数,构造方法会直接用默认的拒绝策略
        ThreadPoolExecutor.AbortPolicy abortPolicy = new ThreadPoolExecutor.AbortPolicy();

        EXECUTOR = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
                keepAliveTime, timeUnit, workQueue, threadFactory);

    }


    /**
     * 获取线程池
     * @return
     */
    public static ThreadPoolExecutor getExecutor() {
        return EXECUTOR;
    }


}

线程池使用示例:

@Slf4j
public class ThreadPoolDemo {

    public static void main(String[] args) {
        asyncTask();
    }


    public static void asyncTask() {
        //获取线程池
        ThreadPoolExecutor executor = ThreadPoolUtil.getExecutor();

        CompletableFuture<Void> cf1 = CompletableFuture.runAsync(() -> {
            System.out.println("执行任务1");
        }, executor);
        //第二个任务
        CompletableFuture<Void> cf2 = CompletableFuture.runAsync(() -> {
            System.out.println("执行任务2");
        }, executor);
        //所有任务的集合
        List<CompletableFuture<Void>> futureList = new ArrayList<>();
        futureList.add(cf1);
        futureList.add(cf2);

        try {
            //所有任务的集合,2秒不出结果就超时
            CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).get(2, TimeUnit.SECONDS);
        } catch (Exception e) {
            log.error("allOf get error.", e);
        }
    }

}

标签:线程,自定义,static,new,public,ThreadPoolExecutor
From: https://www.cnblogs.com/expiator/p/17140760.html

相关文章

  • Hexo 引用本地Html使用自定义页面
    前言hexo在部署时会渲染md文件,将md文件转换为html文件。本地html文件不需要再次渲染,所以只需要在根目录将html跳过渲染即可。具体步骤存放文件在[ROOT]\source\创......
  • idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
    本文为博主原创,未经允许不得转载:mybatisplus 使用过程中已经很大程度提升了我们开发的效率,因为它内部已经对单表的操作进行了完美的封装,但是关联表操作时,这时就需要自......
  • 线程面试top50题
    多线程面试题整理:在典型的Java面试中,面试官会从线程的基本概念问起,如:为什么你需要使用线程,如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口......
  • T-SQL里数据库工程师都不知道的秘密之SQL Server自定义函数UDF
    T-SQLSQLServerUDF自定义函数概念与案例实战函数的定义这里的函数指的是用户自定义函数(UDF)全名为(user-definedfunction),以下简称为函数。它是数据库里的用户自定义程......
  • 线程常见面试题
    1.线程和进程有什么区别?进程:程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存,在指令运行过程中还需要用到磁盘,网络等设备,......
  • 为啥Python多线程爬虫跑的慢?
    单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的......
  • 多线程并发(二):聊聊AQS中的共享锁实现原理
    在上一篇文章多线程并发(一)中我们通过acquire()详细地分析了AQS中的独占锁的获取流程,提到独占锁,自然少不了共享锁,所以我们这边文章就以AQS中的acquireShared()方法为例,......
  • Python多线程如何保证数据安全
    之前有一篇文章分享了有关Python多线程的一次基础语法以及GIL的相关概念,今天我们重点讲解多线程的数据安全问题。数据安全问题我们首先来举一个例子,这里定义两个函数,一个......
  • elasticsearch之使用正则表达式自定义分词逻辑
    一、PatternAnalyzer简介elasticsearch在索引和搜索之前都需要对输入的文本进行分词,elasticsearch提供的patternanalyzer使得我们可以通过正则表达式的简单方式来定义分......
  • ThreadPool线程池工具类
    packagecom.rc.openapi.util;importcom.google.common.util.concurrent.ThreadFactoryBuilder;importjava.util.concurrent.*;publicclassThreadPoolService{/**......