当前位置: 首页 > article >正文

Java中ExecutorService接口介绍、应用场景和示例代码

概述

ExecutorService 是 Java 中用于管理线程池的接口,它属于 java.util.concurrent 包。它提供了用于管理并发任务的功能,包括任务的提交、执行和线程池的生命周期管理。以下是对 ExecutorService 的详细讲解、应用场景和示例代码。

1. 详细讲解

1.1 主要方法
  • submit():提交一个任务用于执行,可以返回一个 Future 对象,该对象代表任务的结果。
  • invokeAll():提交一组任务并在所有任务完成后返回。
  • invokeAny():提交一组任务并返回第一个完成的任务的结果。
  • shutdown():平滑地关闭线程池,不再接受新任务,但会继续执行已提交的任务。
  • shutdownNow():立即关闭线程池,尝试停止所有正在执行的任务并返回待执行的任务列表。
1.2 线程池类型
  • 固定线程池:线程池中的线程数量固定。适用于处理负载相对稳定的任务。
  • 可缓存线程池:根据需要创建新线程,空闲线程会被回收。适用于处理大量短期任务。
  • 单线程池:只有一个线程执行任务,适用于需要顺序执行任务的场景。
  • 定时任务线程池:可以在指定的延迟后执行任务或定期执行任务。

2. 应用场景

  • 高并发处理:处理大量短时间内需要完成的任务,比如并发请求处理。
  • 定时任务调度:定期执行某些任务,如清理操作或数据备份。
  • 资源管理:有效地管理和重用线程资源,降低线程创建和销毁的开销。

3. 示例代码

以下是使用 ExecutorService 的简单示例,演示了如何创建固定线程池、提交任务并处理结果。

import java.util.concurrent.*;

public class ExecutorServiceExample {
    public static void main(String[] args) {
        // 创建一个固定大小的线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        
        // 提交任务并处理返回的 Future 对象
        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            Future<Integer> future = executor.submit(() -> {
                // 模拟任务执行
                Thread.sleep(1000);
                return taskId * 2; // 返回结果
            });
            
            // 处理任务结果
            try {
                Integer result = future.get(); // 获取结果,可能会阻塞
                System.out.println("Task " + taskId + " completed with result: " + result);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }

        // 关闭线程池
        executor.shutdown();
        
        // 处理任务完成后的操作
        try {
            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                executor.shutdownNow(); // 强制关闭
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
        }
        
        System.out.println("All tasks completed.");
    }
}

代码解析

  1. 创建线程池

    • 使用 Executors.newFixedThreadPool(3) 创建一个固定大小的线程池,最多可以同时运行三个线程。
  2. 提交任务

    • 使用 executor.submit() 提交任务,该方法返回一个 Future 对象,可以用来获取任务的结果。
  3. 处理结果

    • 使用 future.get() 获取任务的结果,调用该方法会阻塞,直到任务完成。
  4. 关闭线程池

    • 调用 executor.shutdown() 关闭线程池,停止接收新任务并等待已提交任务完成。
    • 使用 awaitTermination() 等待所有任务完成,设定超时时间。

总结

ExecutorService 是 Java 并发编程的重要接口,通过合理使用线程池,可以有效地管理线程资源,提高程序的性能和可维护性。适用于各种场景,包括高并发处理、定时任务调度等。


http://www.kler.cn/a/523713.html

相关文章:

  • sem_init的概念和使用案例
  • github制作静态网页
  • DeepSeek理解概率的能力
  • 乌兰巴托的夜---音乐里的故事
  • 《深度剖析Q-learning中的Q值:解锁智能决策的密码》
  • 登录授权流程
  • 如何运用python爬虫爬取百度贴吧的静态图片?
  • 懂球短视频微信小程序SpringBoot+论文源码调试讲解
  • 06-AD向导自动创建P封装(以STM32-LQFP48格式为例)
  • Linux 基础1
  • 【C++题解】1393. 与7无关的数?
  • centos7搭建flink1.18并以 standalone模式启动
  • 前端UI组件库的打包与发布
  • 网站服务器出现延迟的原因是什么?
  • 使用 lock4j-redis-template-spring-boot-starter 实现 Redis 分布式锁
  • EtherCAT主站IGH-- 54 -- IGH之控制电机旋转周期同步位置模式(CSP模式)
  • Java阶段四06
  • 【452. 用最少数量的箭引爆气球 中等】
  • 使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录
  • C++11中array容器的常见用法
  • fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)
  • Unity游戏(Assault空对地打击)开发(3) 摄像机跟随
  • 卡通圣诞节404动画页面模板
  • Spring Security(maven项目) 3.0.2.8版本
  • 17.Word:李楠-学术期刊❗【29】
  • C语言中string.h头文件功能介绍