【10月更文挑战第2天】Java线程池的使用

简介: 【10月更文挑战第2天】Java线程池的使用

Java 线程池是一种执行器(Executor),用于在一个后台线程中执行任务。线程池的主要目的是减少在创建和销毁线程时所产生的性能开销。通过重用已经创建的线程来执行新的任务,线程池提高了程序的响应速度,并且提供了更好的系统资源管理。

以下是 Java 线程池的一些基本使用方法:

  1. 创建线程池
    Java 提供了 Executors 工厂类来创建不同类型的线程池。

    // 创建一个固定大小的线程池
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
    
    // 创建一个可缓存的线程池,它会根据需要创建新线程
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    
    // 创建一个单线程的执行器
    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    
    // 创建一个定时以及周期性任务的线程池
    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
    
  2. 提交任务给线程池

    • 提交 Runnable 任务:

      fixedThreadPool.execute(new Runnable() {
             
          public void run() {
             
              // 任务代码
          }
      });
      
    • 提交 Callable 任务,并获取 Future 对象:

      Callable<String> callable = new Callable<String>() {
             
          public String call() throws Exception {
             
              return "任务结果";
          }
      };
      Future<String> future = fixedThreadPool.submit(callable);
      String result = future.get(); // 获取任务结果
      
  3. 关闭线程池

    • 平滑关闭线程池,执行已提交的任务,不接受新任务:

      fixedThreadPool.shutdown();
      
    • 尝试立即停止所有正在执行的任务,暂停处理等待的任务,并返回等待执行的任务列表:

      List<Runnable> notExecutedTasks = fixedThreadPool.shutdownNow();
      
  4. 等待线程池终止

    • 在调用 shutdown 方法后,可以调用 awaitTermination 方法等待所有任务完成:

      fixedThreadPool.shutdown();
      try {
             
          if (!fixedThreadPool.awaitTermination(60, TimeUnit.SECONDS)) {
             
              fixedThreadPool.shutdownNow();
          }
      } catch (InterruptedException e) {
             
          fixedThreadPool.shutdownNow();
      }
      
  5. 自定义线程池

    • 可以通过构造函数自定义线程池的参数:

      int corePoolSize = 4;
      int maximumPoolSize = 10;
      long keepAliveTime = 120;
      TimeUnit unit = TimeUnit.SECONDS;
      BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
      ThreadFactory threadFactory = Executors.defaultThreadFactory();
      RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
      ExecutorService customThreadPool = new ThreadPoolExecutor(
          corePoolSize,
          maximumPoolSize,
          keepAliveTime,
          unit,
          workQueue,
          threadFactory,
          handler
      );
      
  6. 处理拒绝的任务

    • 可以通过实现 RejectedExecutionHandler 接口来处理当任务被拒绝时的行为:

      class MyRejectedExecutionHandler implements RejectedExecutionHandler {
             
          public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
             
              // 处理拒绝任务的逻辑
          }
      }
      
  7. 监控线程池

    • 可以通过 ThreadPoolExecutor 提供的方法来监控线程池的状态:

      long activeCount = customThreadPool.getActiveCount();
      long taskCount = customThreadPool.getTaskCount();
      

使用线程池时,应该根据应用程序的实际需求来选择合适的线程池类型和参数,以确保资源的有效利用和应用程序的性能。同时,合理地关闭线程池也是非常重要的,以避免资源泄露。

相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
4天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
1天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
198 10
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
21天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2578 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
3天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
165 2
|
1天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
100 65
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1577 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
232 2