Java线程池
本文最后更新于 328 天前,其中的信息可能已经有所发展或是发生改变。

功能:主要用于管理和限制创建线程的数量,提高资源的利用率和系统的稳定性

适用场景:

  1. 服务器应用程序:在Web服务器或应用服务器中,线程池用于处理并发的客户端请求。使用线程池可以快速响应客户端请求,提高服务器的吞吐量。
  2. 并行数据处理:在需要并行处理大量数据的应用中,如数据分析、图像处理等,线程池可以有效地将数据分割成小块并行处理,缩短处理时间。
  3. 异步任务执行:在需要执行大量短暂异步任务的应用程序中,如GUI应用程序中的事件处理,线程池可以提供快速的任务执行能力,避免因频繁创建和销毁线程而造成的资源浪费。
  4. 资源密集型任务:对于CPU或I/O密集型的任务,线程池可以帮助合理分配和限制并发执行的任务数量,避免过度竞争资源导致的性能下降。

一般情况下,任务分为 IO 密集型和计算密集型( CPU 密集型)两张。

计算机密集型:吃 CPU,比如音视频处理、图像处理、数字计算等,一般是 corePoolSize 为 CPU 的核数 + 1(空余线程),可以让每个线程都能利用好 CPU 的每个核,而且线程之间不用频繁切换(减少大家、减少开销)

IO 密集型:吃带宽/内存/硬盘/的读写资源,corePoolSize 可以设置大一点,一般经验值是 2n 左右,但是建议以 IO 的能力为主。

  1. 定时任务和周期性任务:线程池配合定时器(如Java中的ScheduledThreadPoolExecutor)可以用于执行定时任务或周期性任务,如定期清理缓存、定期检查系统状态等。
  2. 微服务和分布式系统:在微服务架构或分布式系统中,线程池用于处理来自其他服务的请求或执行后台任务,提高服务的响应速度和系统的可伸缩性。

优点:

  • 提高资源利用率:通过重用已存在的线程,减少线程创建和销毁的开销。
  • 提高系统响应速度:任务可以不需要等待线程创建就立即执行。
  • 提供更好的系统管理:可以统一分配、调优和监控线程资源。

缺点:

  • 实现相对复杂,考虑的点很多

线程池的实现

不用自己写,如果是在 Spring 中,可以用 ThreadPoolTaskExecutor 配合 @Async 注解来实现。(不太建议)

如果是在 Java 中,可以使用 JUC 并发编程包中的 ThreadPoolExecutor 来实现非常灵活地自定义线程池。

线程池的参数

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)

参数解释

corePoolSize (核心线程数 = > 正式员工数):正常情况下,我们的系统应该同时工作的线程数(随时就绪状态)

maximumPoolSize(最大线程数 = > 哪怕任务再多,你也最多招那些人 = 正式员工 + 临时工):极限情况下,我们的线程池最多有多少个线程?

keepAliveTime(空间线程存活时间):非核心线程在没有任务的情况下,过多久要删除(理解为开除临时工),从而释放无用的线程资源。

TimeUnit unit(空间线程存活时间的单位):分钟、秒。

workQueue(工作队列):用于存放给线程执行的任务,存在一个队列的长度(一定要设置,不要说队列长度无线,因为也会占用资源)

threadFactory(线程工厂):控制每个线程的生成、线程的属性(比如线程名)

RejectedExecutionHandler(拒绝策略):任务队列满的时候,我们采取什么措施,比如抛异常,不抛异常,自定义策略。

资源隔离策略:比如重要的任务(VIP 任务)一个队列,普通任务一个队列,保证这两个队列互不干扰。

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author :juiwi
 * @date :2024/2/2 17:33
 * @description :提交任务到线程池
 */
@Slf4j
@RequestMapping("/queue")
@RestController
public class QueueController {

    @Resource
    private ThreadPoolExecutor threadPoolExecutor;

    @GetMapping("/add")
    public void add(String name) {
        CompletableFuture.runAsync(() -> {
            log.info("name:{}", name);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, threadPoolExecutor);
    }
}

优化点

  1. 反向压力:https://zhuanlan.zhihu.com/p/404993753,通过调用的服务状态来选择当前系统的策略(比如根据第三方服务的当前任务队列数来控制咱们系统的核心线程数),从而最大利用系统资源
  2. 任务执行成功活失败,给用户发送实时消息通知(实时:websocket、server side event)
  3. 给任务的执行增加 guava Retrying 重试机制,保证系统可靠性。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇