首页 > 其他分享 >不要再用Executors了!!!!!!

不要再用Executors了!!!!!!

时间:2023-02-10 10:25:13浏览次数:43  
标签:不要 Executors int 再用 队列 任务 线程 CPU threadPoolExecutor

1、正确声明线程池

线程池必须手动通过 ThreadPoolExecutor 的构造函数来声明,避免使用Executors 类创建线程池,会有 OOM 风险。

Executors 返回线程池对象的弊端如下:
  • FixedThreadPool 和 SingleThreadExecutor :使用的是无界的 LinkedBlockingQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

  • CachedThreadPool :使用的是同步队列 SynchronousQueue, 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM。

  • ScheduledThreadPool 和 SingleThreadScheduledExecutor : 使用的无界的延迟阻塞队列DelayedWorkQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

    说白了就是:使用有界队列,控制线程创建数量

2、正确配置线程数量

  有一个简单并且适用面比较广的公式:
  * CPU 密集型任务(N+1): 这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1。比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。一旦任务暂停,CPU 就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。
  * I/O 密集型任务(2N): 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是 2N。

  ####如何判断是 CPU 密集任务还是 IO 密集任务?
  CPU 密集型简单理解就是利用 CPU 计算能力的任务比如你在内存中对大量数据进行排序。但凡涉及到网络读取,文件读取这类都是 IO 密集型,这类任务的特点是 CPU 计算耗费时间相比于等待 IO 操作完成的时间来说很少,大部分时间都花在了等待 IO 操作完成上。

3、spring boot中怎么自定义一个线程池?

点击查看代码
@Configuration
@EnableAsync
public class ThreadPoolExecutorConfig {

    @Bean(name="threadPoolExecutor")
    public Executor threadPoolExecutor(){
        ThreadPoolTaskExecutor threadPoolExecutor = new ThreadPoolTaskExecutor();
        int processNum = Runtime.getRuntime().availableProcessors(); // 返回可用处理器的Java虚拟机的数量
        int corePoolSize = (int) (processNum / (1 - 0.2));
        int maxPoolSize = (int) (processNum / (1 - 0.5));
        threadPoolExecutor.setCorePoolSize(corePoolSize); // 核心池大小
        threadPoolExecutor.setMaxPoolSize(maxPoolSize); // 最大线程数
        threadPoolExecutor.setQueueCapacity(maxPoolSize * 1000); // 队列程度
        threadPoolExecutor.setThreadPriority(Thread.MAX_PRIORITY);
        threadPoolExecutor.setDaemon(false);
        threadPoolExecutor.setKeepAliveSeconds(300);// 线程空闲时间
        threadPoolExecutor.setThreadNamePrefix("test-Executor-"); // 线程名字前缀
        return threadPoolExecutor;
    }
}

标签:不要,Executors,int,再用,队列,任务,线程,CPU,threadPoolExecutor
From: https://www.cnblogs.com/zomicc/p/17107969.html

相关文章

  • 代码不要冗余之道-TDD三定律
    提问什么是TDD三定律回答定律一、在编写不能通过的单元测试前,不可编译生产代码。定律二、只可编写刚好无法通过的单元测试,不能编译也算不过。定律三、只可编写刚好足......
  • jmeter-cookie管理器(第一次使用不要修改任何信息)
    关联前面接口的动态数据信息,提取出来,作为后面接口的传入参数当接口,使用cookie来管理信息时,请使用cookie管理器,而且,第一次使用时,不要去修改任何cookie管理器信息。只要使......
  • 密码不要加密
    我们需要明确,加密的作用是啥?没人关心用户的密码是什么,只会关心能不能登录。只要能登录,拿到的是密码原文还是密码密文其实没区别。我们考虑传输加密的情况明文传......
  • 代码不要冗余之道-不要返回null
    提问方法可以返回null吗?回答千万不要参考提问2参数可以接受输入null吗?回答千万不要参考答案开始进行TDD吧100%的单测覆盖率、行覆盖分支覆盖......
  • 代码不要冗余之道-不要返回null
    提问方法可以返回null吗?回答千万不要返回null,返回null只会增加非空检验成本;拓展属性声明例如string类型则此属性应该在构造函数中实例化string?类型则不用在构造......
  • 3万行代码硬撸一个一键发布文章工具,简直不要太好用,从此写文章,发文章,太简单了好伐
    §theme:channing-cyanhighlight:github-gist本人6年前端开发老鸟-【程序员蜗牛】,欢迎沟通交流§操作演示(视频)视频演示§项目背景程序员工作中,不免会遇到一......
  • HDU-2089-不要62
    ​​点这里查看题目​​#include<stdio.h>#definemaxn1000010intf[maxn];intweishu(inta){intb=1;while(1){if(a/10==0)break;......
  • 代码不要冗余之道-得墨忒尔律
    提问什么是得墨忒尔律回答隐藏数据暴露操作不要调用方法返回对象中的方法......
  • [原创]Kotlin不要乱用runCatching,小心异常无反应
    这个比较坑的事情我测试程序里本来是使用kotlin里的runCatching方法,来避免异常的。我调用系统邮件应用来发送邮件,添加附件后总是没反应,日志也没有。我也很无语。。。。......
  • 代码不要冗余之道-缩进
    代码文件是一种继承结构,不是大钢结构;这种继承结构使每一层都圈定一个范围;缩进使这种范围可见;提问1单行if,while应该缩进为一行码?回答坍缩成一行虽然减少了代码行数,但明......