博客
关于我
Java自定义线程池来模拟银行办理业务场景来解析ThreadPoolExecutor的七大参数和四大拒绝策略
阅读量:370 次
发布时间:2019-03-05

本文共 2317 字,大约阅读时间需要 7 分钟。

为什么选择使用 ThreadPoolExecutor 而不是 Executor?

在阿里巴巴的开发手册中,明确指出不推荐直接使用 Executors 来创建线程,而是应该使用 ThreadPoolExecutor。这种选择背后的原因有很多,但最重要的原因之一是 ThreadPoolExecutor 提供了更好的线程管理和资源利用能力。

ThreadPoolExecutor 有七大参数,你需要了解它们

在使用 ThreadPoolExecutor 时,它提供了七个关键参数,这些参数对于配置线程池的性能和行为至关重要。以下是这些参数的解释:

  • 核心线程数(corePoolSize):指定线程池的核心线程数量。核心线程用于处理正常的工作量。
  • 最大线程数(maxPoolSize):指定线程池的最大线程数量。当核心线程已满时,继续提交任务时会创建额外的线程。
  • 超时时间(timeUnit):指定线程等待的超时时间。如果线程在等待任务时超过指定时间,就会关闭线程并释放资源。
  • 候客区队列(linkedBlockingQueue):指定线程池的候客区队列大小。当核心线程忙于处理任务时,未被立即处理的任务会被放入候客区队列中等待。
  • 线程工厂(threadFactory):指定用于创建线程的工厂。默认工厂会使用系统的线程。
  • 拒绝策略(rejectionPolicy):指定线程池在遇到拒绝任务时的策略。常见策略包括抛出异常、丢弃旧任务等。
  • ThreadPoolExecutor 的拒绝策略有四种选择

    ThreadPoolExecutor 提供了四种拒绝策略,允许开发者根据具体需求选择最适合的策略:

  • 直接抛出异常:当线程池已经满员时,新提交的任务会直接抛出 RejectedExecutionException 异常。
  • 丢弃旧任务(DiscardOldestPolicy):当线程池已经满员时,会丢弃最旧的任务。
  • 丢弃新任务(DiscardNewestPolicy):当线程池已经满员时,会丢弃最新的任务。
  • 等待任务完成后丢弃(SameThreadModel):当线程池已经满员时,会等待当前线程完成任务后再丢弃新任务。
  • 如何通过 Java 实现银行办理业务场景

    在实际业务场景中,银行的业务办理可以通过 ThreadPoolExecutor 来模拟。以下是一个典型的实现示例:

    import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolExecutorDemo {    public static void main(String[] args) {        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(                2, // 最多开启2个窗口                5, // 最多同时处理的业务量                2, // 超时时间(秒)                TimeUnit.SECONDS,                new LinkedBlockingQueue<>(3), //候客区最多容纳3个客户                Executors.defaultThreadFactory(),                new ThreadPoolExecutor.DiscardOldestPolicy()        );        try {            // 最大承载能力:窗口 + 候客区            for (int i = 1; i <= 9; i++) {                threadPool.execute(() -> {                    System.out.println(Thread.currentThread().getName() + " ok");                });            }        } catch (Exception e) {            e.printStackTrace();        } finally {            threadPool.shutdown();        }    }}

    测试结果分析

    通过上述代码可以发现:

    • 当有1~5个客户同时办理业务时,只会使用前两个窗口处理业务。
    • 当有6~8个客户办理业务时,银行会开启额外的窗口来处理业务。
    • 当客户数量超过8个时,银行会采用拒绝策略(如抛出异常)。

    ThreadPoolExecutor 的七大参数解析

    ThreadPoolExecutor 的七大参数如下:

    • corePoolSize:2(最多开启2个窗口)
    • maxPoolSize:5(最多同时处理的业务量)
    • timeUnit:2(超时时间)
    • linkedBlockingQueue:3(候客区最多容纳3个客户)
    • threadFactory:默认线程工厂
    • rejectionPolicy:丢弃旧任务策略

    通过合理配置这些参数,可以实现更高效的线程管理和资源利用。

    转载地址:http://myhg.baihongyu.com/

    你可能感兴趣的文章
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVelocity标签使用详解
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>
    NVIDIA-cuda-cudnn下载地址
    查看>>
    nvidia-htop 使用教程
    查看>>
    nvidia-smi 参数详解
    查看>>
    nvm安装以后,node -v npm 等命令提示不是内部或外部命令 node多版本控制管理 node多版本随意切换
    查看>>
    NYOJ 1066 CO-PRIME(数论)
    查看>>
    nyoj------203三国志
    查看>>