ExecutorService invokeAll 实例(转)

本文介绍了一个使用Java并发编程技术实现的批量查询功能,通过创建一系列搜索任务并利用Future API,实现了在指定时间内查询多个班级的学生集合。代码示例展示了如何使用ExecutorService、Callable接口以及Future API来高效地完成查询任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 10个班级,每个班级20名学生,在指定的时间内查询每个班级学生的集合。 

Java代码  收藏代码
    1. package cn.com.ld.study.thread;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.Collection;  
    5. import java.util.HashMap;  
    6. import java.util.List;  
    7. import java.util.Map;  
    8. import java.util.concurrent.Callable;  
    9. import java.util.concurrent.ExecutionException;  
    10. import java.util.concurrent.ExecutorService;  
    11. import java.util.concurrent.Executors;  
    12. import java.util.concurrent.Future;  
    13. import java.util.concurrent.TimeUnit;  
    14.   
    15. public class FutureTest {  
    16.     //缓存操作数据集  
    17.     private static final Map<Integer, List<Student>> sutdenMap = new HashMap<Integer, List<Student>>();  
    18.     //初始化操作数据  
    19.     static {  
    20.         List<Student> stuList = null;  
    21.         Student stu;  
    22.         for (int i = 0; i < 10; i++) {  
    23.             stuList = new ArrayList<Student>();  
    24.             for (int j = 0; j < 2; j++) {  
    25.                 stu = new Student(j, "zld_" + i + "." + j, i);  
    26.                 stuList.add(stu);  
    27.             }  
    28.             sutdenMap.put(i, stuList);  
    29.         }  
    30.     }  
    31.   
    32.     public static class Student {  
    33.         private int id;  
    34.         private String name;  
    35.         private int classID;  
    36.   
    37.         public Student(int id, String name, int classID) {  
    38.             this.id = id;  
    39.             this.name = name;  
    40.             this.classID = classID;  
    41.         }  
    42.   
    43.         public String toString() {  
    44.             return Student.class.getName() + "(id:" + this.id + ",name:"  
    45.                     + this.name + ")";  
    46.         }  
    47.   
    48.     }  
    49.       
    50.     /**    
    51.      * @filename: SearchTask    
    52.      * @description: 查询任务   
    53.      * @author lida   
    54.      * @date 2013-4-1 下午3:02:29       
    55.      */  
    56.     public static class SearchTask implements Callable<List<Student>> {  
    57.   
    58.         public final int classID;  
    59.         public long sleepTime;  
    60.   
    61.         /**    
    62.          * <p>Title: </p>    
    63.          * <p>Description: </p>    
    64.          * @param classID  班级编号 
    65.          * @param sleepTime  模拟操作所用的时间数(毫秒) 
    66.          */  
    67.         SearchTask(int classID, long sleepTime) {  
    68.             this.classID = classID;  
    69.             this.sleepTime = sleepTime;  
    70.         }  
    71.   
    72.         @Override  
    73.         public List<Student> call() throws Exception {  
    74.             //模拟操作所用的时间数(毫秒)  
    75.             Thread.sleep(sleepTime);  
    76.             List<Student> stuList = sutdenMap.get(classID);  
    77.             return stuList;  
    78.         }  
    79.   
    80.     }  
    81.   
    82.     public static void main(String[] args) {  
    83.         FutureTest ft = new FutureTest();  
    84.         ExecutorService exec = Executors.newCachedThreadPool();  
    85.         List<SearchTask> searchTasks = new ArrayList<SearchTask>();  
    86.         SearchTask st;  
    87.         for (int i = 0; i < 10; i++) {  
    88.             st = new SearchTask(i, 2001);//指定2001 毫米为最大执行时间  
    89.             searchTasks.add(st);  
    90.         }  
    91.   
    92.         try {  
    93.             //要求认为在2000毫秒内返回结果,否则取消执行。  
    94.             List<Future<List<Student>>> futures = exec.invokeAll(searchTasks,  
    95.                     2000, TimeUnit.MILLISECONDS);//invokeAll 第一个参数是任务列表;第二个参数是过期时间;第三个是过期时间单位  
    96.             for (Future<List<Student>> future : futures) {  
    97.                 List<Student> students = future.get();  
    98.                 for (Student student : students) {  
    99.                     System.out.println(student.toString());  
    100.                 }  
    101.             }  
    102.             exec.shutdown();  
    103.         } catch (InterruptedException e) {  
    104.             e.printStackTrace();  
    105.             Thread.interrupted();  
    106.         } catch (ExecutionException e) {  
    107.             e.printStackTrace();  
    108.         }  
    109.     }  
    110. }  
    111. http://zld406504302.iteye.com/blog/1840091
<think>好的,用户想了解如何使用ExecutorService,需要方法指南和代码示例。首先,我需要整理ExecutorService的基本概念和主要功能。根据引用内容,ExecutorServiceJava中管理线程池的接口,可以通过Executors工厂类创建不同类型的线程池,比如单线程、固定大小线程池和可调度线程池。用户可能需要知道如何创建实例、提交任务以及关闭服务。 接下来,要分步骤说明使用方法。第一步是创建实例,引用1和2提供了三种创建方式:newSingleThreadExecutor、newFixedThreadPool和newScheduledThreadPool。需要详细解释每种线程池的特点,比如单线程适用于顺序执行,固定大小适合并发任务,可调度用于定时任务。 第二步是提交任务。引用3中的示例展示了使用execute方法提交Runnable任务,而引用4则提到使用submit或invokeAll处理Callable任务。需要区分这两种任务类型,Runnable没有返回值,Callable可以返回结果。需要给出代码示例,比如如何提交多个任务并获取Future对象。 第三步是关闭ExecutorService,这点在引用4的finally块中有提到shutdown方法。需要强调正确关闭的重要性,避免资源泄漏。可能还要介绍shutdownNow的强制关闭方法,但需要注意未完成任务的处理。 然后,提供完整的代码示例。结合引用3和4,可以展示一个使用固定线程池处理多个任务的例子,包括创建线程池、提交任务、处理结果和关闭服务。同时,可以加入Callable的示例,说明如何获取任务返回值,如引用4中的invokeAll和Future的使用。 另外,需要提醒用户注意异常处理和资源释放,确保线程池在不再使用时被正确关闭。可能还需要提到线程池的配置参数,比如核心线程数、最大线程数等,但用户的问题可能更关注基础使用,所以这部分可以简要带过或放在相关问题中。 最后,生成相关问题,帮助用户深入理解,比如如何选择线程池类型、处理任务返回值、配置参数等。这些需要基于现有引用内容扩展,确保问题相关且有参考价值。 检查是否所有LaTeX格式正确,但用户的问题不涉及数学公式,可能不需要使用。但根据系统指令,行内表达式需要用$...$,但这里可能用不上,需要注意是否有变量或代码块需要特别标注。不过代码示例已经用代码块格式,所以没问题。 需要确保回答结构清晰,分步骤说明,并包含代码示例。同时引用相关的引用,比如创建线程池的方法在引用1和2中提到,任务提交在引用3和4中,关闭服务在引用4。在适当的位置添加引用标识,如创建实例时引用[^1][^2],提交任务时引用[^3][^4]。</think>以下是为您整理的ExecutorService使用方法及代码示例: ### 一、ExecutorService核心用法 1. **创建线程池实例** 通过Executors工厂类创建三种典型线程池: ```java // 单线程池(顺序执行任务) ExecutorService executor1 = Executors.newSingleThreadExecutor(); // [^1][^2] // 固定大小线程池(处理突发任务) ExecutorService executor2 = Executors.newFixedThreadPool(10); // [^1][^2] // 可调度线程池(定时/周期任务) ScheduledExecutorService executor3 = Executors.newScheduledThreadPool(10); // [^2] ``` 2. **提交任务** 支持Runnable和Callable两种任务类型: ```java // 提交Runnable任务(无返回值) executor.execute(new Runnable() { @Override public void run() { System.out.println("执行任务"); } }); // [^3] // 提交Callable任务(带返回值) Future<Integer> future = executor.submit(() -> { return 1 + 1; }); ``` 3. **关闭线程池** ```java executor.shutdown(); // 温和关闭(完成已提交任务) executor.shutdownNow(); // 强制关闭(返回未执行任务列表) ``` ### 二、完整代码示例 ```java import java.util.Arrays; import java.util.List; import java.util.concurrent.*; public class ExecutorDemo { public static void main(String[] args) throws Exception { // 创建固定线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // [^3] // 提交多个Callable任务 List<Callable<Integer>> tasks = Arrays.asList( () -> { Thread.sleep(1000); return 1; }, () -> { Thread.sleep(500); return 2; }, () -> { return 3; } ); // 批量执行并获取结果 List<Future<Integer>> futures = executor.invokeAll(tasks); // [^4] for (Future<Integer> f : futures) { System.out.println("结果:" + f.get()); } executor.shutdown(); // [^4] } } ``` ### 三、关键特性说明 | 方法 | 说明 | 适用场景 | |-------------------------|------------------------------------|----------------------| | newSingleThreadExecutor | 保证任务顺序执行 | 需要严格顺序的场景 | | newFixedThreadPool | 控制最大并发数 | Web服务请求处理 | | newCachedThreadPool | 自动扩容线程池 | 短期异步任务处理 | | newScheduledThreadPool | 支持定时/周期性任务 | 定时数据同步 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值