首页 > 编程语言 >Java 线程池优化

Java 线程池优化

时间:2024-05-27 09:04:05浏览次数:22  
标签:1.5 Java 1.2 队列 任务 线程 import 优化

1. Java 线程池优化

1.1. 核心线程数

  • CPU 密集型线程池计算公式:
核心线程数 = CPU 核心数 + 1
  • IO 密集型线程池计算公式:
核心线程数 = ((线程等待时间 + 线程 CPU 时间)/线程 CPU 时间)* CPU 数目

1.2. 任务队列

java.util.concurrent.BlockingQueue 的子类大多可作为任务队列,但一般使用 java.util.concurrent.ArrayBlockingQueuejava.util.concurrent.LinkedBlockingQueuejava.util.concurrent.SynchronousQueue 作为任务队列。

1.2.1. LinkedBlockingQueue

基于链表的阻塞队列。

调用 LinkedBlockingQueue(int capacity) 构造方法指定队列大小时,作为有界任务队列。

调用 LinkedBlockingQueue() 无参构造方法时,等价于 LinkedBlockingQueue(Integer.MAX_VALUE),队列大小为 2147483647,一般任务数量达到这个数值时,程序已经 OOM 了,所以相当于无界任务队列,本质上还是有界任务队列。

1.2.2. ArrayBlockingQueue

基于数组的阻塞队列。构造方法必须指定队列大小,是有界任务队列。

1.2.3. SynchronousQueue

队列大小为 0 的阻塞队列,添加到队列的任务将立即被处理,当所有核心线程处于活动状态,线程池将新建新的线程来处理任务,直至达到最大线程数。

1.2.4. 总结

一般使用 ArrayBlockingQueue 有界阻塞队列,队列大小视实际情况而定,一般取 10000

1.3. 最大线程数

当所有核心线程均处于活动状态,并且任务队列已满,线程池才会新建新的线程来处理任务,直至所有线程达到最大线程数。

最大线程数视实际情况而定,一般取核心线程数 * 2

1.4. 线程存活时间

视实际情况而定,一般一分钟

1.5. 拒绝策略

当任务队列已满,并且线程池已达到最大线程数量时,提交任务到线程池将被拒绝。Java 定义了 4 种拒绝策略。

1.5.1. AbortPolicy(默认策略)

抛出 RejectedExecutionException 来拒绝新提交的任务。

1.5.2. CallerRunsPolicy

调用者所在的线程会尝试执行被拒绝的任务。

1.5.3. DiscardPolicy

不采取任何措施,丢弃无法处理的任务。

1.5.4. DiscardOldestPolicy

丢弃队列最前面的任务,然后尝试再次提交被拒绝的任务。

1.5.5. 总结

重要数据处理任务使用 CallerRunsPolicy,避免数据丢失。或者使用 AbortPolicy,并做好异常善后处理。

1.6. 最终优化代码

  1. IO 密集型线程池
import cn.hutool.core.thread.ExecutorBuilder;
import cn.hutool.core.thread.ThreadUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadPoolConfiguration {
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        return ExecutorBuilder.create()
                .setCorePoolSize(availableProcessors * 50)
                .setMaxPoolSize(availableProcessors * 100)
                .setKeepAliveTime(1L, TimeUnit.MINUTES)
                .useArrayBlockingQueue(10_000)
                .setHandler(new ThreadPoolExecutor.CallerRunsPolicy())
                .setThreadFactory(ThreadUtil.createThreadFactory("my-thread-"))
                .build();
    }
}
  1. CPU 密集型线程池
import cn.hutool.core.thread.ExecutorBuilder;
import cn.hutool.core.thread.ThreadUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadPoolConfiguration {
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        return ExecutorBuilder.create()
                .setCorePoolSize(availableProcessors + 1)
                .setMaxPoolSize(availableProcessors +1)
                .setKeepAliveTime(1L, TimeUnit.MINUTES)
                .useSynchronousQueue()
                .setHandler(new ThreadPoolExecutor.CallerRunsPolicy())
                .setThreadFactory(ThreadUtil.createThreadFactory("my-thread-"))
                .build();
    }
}

标签:1.5,Java,1.2,队列,任务,线程,import,优化
From: https://www.cnblogs.com/jason207010/p/18214699

相关文章

  • 基于GWO灰狼优化的CNN-GRU-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览优化前     优化后     2.算法运行软件版本matlab2022a 3.算法理论概述      时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(ConvolutionalNeuralNet......
  • 生产环境中秒杀接口并发量剧增与负载优化策略探讨
    ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ ......
  • 解决前端性能瓶颈:高效处理大量数据渲染与复杂交互的策略与优化方法
    ✨✨祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心!✨✨ ......
  • java可变参数
     展示了如何使用可变参数(varargs)来处理不同数量的参数输入/***@author:javaRao*@date:Createdin2023-06-3015:41*@description:*/publicclassMod7{publicstaticvoidmain(String[]args){//调用ar方法,传递一个参数ar(1);......
  • Java中生成二维码转为base64存入MySQL数据库中
    1.引入架包<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId>......
  • 零基础学Java第二十三天之网络编程
    网络编程1.网络编程实现多台计算机之间实现数据的共享和传递,网络应用程序主要组成为:网络编程+IO流+多线程2.网络编程三要素网络通讯的模型:请求-响应,客户端-服务端三要素:IP地址,端口,协议(数据传输的规则)2.1.IP地址IP地址:网络中计算机的唯一标识(IP地址是一个32位的二......
  • 零基础学Java第二十三天之网络编程Ⅱ
    1.InetAddress类用来表示主机的信息练习:C:\Windows\system32\drivers\etc\hosts一个主机可以放多个个人网站www.baidu.com/14.215.177.37www.baidu.com/14.215.177.38www.taobao.com/183.61.241.252www.taobao.com/121.14.89.2532.Socket3.TCP编程API:Socket,S......
  • 分析JAVA打印流的自动刷新
    参考:https://blog.csdn.net/xshsjl/article/details/77076235参考:https://blog.csdn.net/weixin_43369921/article/details/111397253今天遇到了一个奇怪的事情,使用打印流,有一个自动刷新的参数,但设不设置结果貌似没啥影响,下面来研究研究publicPrintStream(OutputStreamout,......
  • 非凸优化收敛性证明框架
    \chapter{非凸优化}\section{非凸优化中的重要概念}\subsection{次微分}\begin{definition}{Frechet次微分}适当函数\(f\),如果\(\forallx\in\)dom$f\(,则\)f\(在\)x\(处的Frechet次微分记为\)\overset{-}{\partial}f(x)$,它的定义是:$$\overset{-}{\partial}f(x)=\left\l......
  • 使用DQN 来优化车间排产JSP探索
    首先感谢莫烦大神的python强化学习的教程让我能快速了解强化学习自从几年前从事智能工厂建设工作,对于APS听到最多的就是APS上线失败的案例。让自己开始思考APS上线的难度到底在哪里?可能主要原因是APS动态性问题待解决,信息化孤岛的问题。动态性主要是客户订单变化、现场生产......