ExecutorService是Java并发编程核心工具,用于管理线程池和异步任务执行。1. 通过Executors工厂类创建不同线程池:newFixedThreadPool创建固定大小线程池,newCachedThreadPool创建可缓存线程池,newSingleThreadExecutor创建单线程池,newScheduledThreadPool支持定时或周期性任务。示例:ExecutorService executor = Executors.newFixedThreadPool(4);2. 提交任务有三种方式:submit(Runnable task)提交无返回值任务,返回Future对象;submit(Runnable task, T result)提交任务并返回指定类型Future,result作为返回值容器;submit(Callable task)提交有返回值任务,call()方法返回结果或抛出异常。3. 控制任务执行与关闭线程池:shutdown()启动有序关闭,不再接受新任务但已提交任务继续执行;shutdownNow()尝试停止所有正在执行任务,返回未执行任务列表;awaitTermination(long timeout, TimeUnit unit)配合shutdown使用,等待所有任务完成。4. 实际应用场景示例:并发处理多个用户请求并汇总结果。掌握submit用法、区分Runnable与Callable、正确关闭线程池是关键。实际开发中建议结合try-finally或try-with-resources确保线程池释放。

在Java中,ExecutorService 是并发编程的核心工具之一,它属于 java.util.concurrent 包,用于管理线程池和异步任务执行。通过它,开发者无需手动创建和管理线程,而是将任务提交给线程池,由其自动调度执行。
1. 创建ExecutorService实例
使用 Executors 工厂类可以快速创建不同类型的线程池:
- newFixedThreadPool(n):创建固定大小的线程池
- newCachedThreadPool():创建可缓存的线程池,按需创建线程
- newSingleThreadExecutor():单线程池,保证任务顺序执行
- newScheduledThreadPool(n):支持定时或周期性任务执行
示例:
ExecutorService executor = Executors.newFixedThreadPool(4);
2. 提交任务的三种方式
ExecutorService 支持提交 Runnable 和 Callable 类型的任务,主要方法有以下几种:
立即学习“Java免费学习笔记(深入)”;
submit(Runnable task)提交无返回值的任务,返回一个 Future> 对象,可用于判断任务是否完成。
Future> future = executor.submit(() -> {
System.out.println("执行无返回值任务");
});
// future.get() 可阻塞等待完成
submit(Runnable task, T result)
提交任务并返回指定类型的 Future,result 作为返回值容器(适用于需要获取结果的场景)。
StringBuilder result = new StringBuilder(); Futuresubmit(Callablefuture = executor.submit(() -> { result.append("任务完成"); }, result); StringBuilder res = future.get(); // 获取结果
提交有返回值的任务,Callable 的 call() 方法可返回结果或抛出异常。
Futurefuture = executor.submit(() -> { return 100 + 200; }); Integer sum = future.get(); // 获取计算结果 System.out.println("结果:" + sum);
3. 控制任务执行与关闭线程池
提交任务后,合理管理线程池生命周期至关重要,避免资源泄漏。
shutdown()启动有序关闭,不再接受新任务,已提交任务会继续执行。
executor.shutdown();shutdownNow()
尝试停止所有正在执行的任务,返回未执行的任务列表。
ListawaitTermination(long timeout, TimeUnit unit)remainingTasks = executor.shutdownNow();
配合 shutdown 使用,等待所有任务完成。
executor.shutdown();
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow(); // 超时后强制关闭
}
4. 实际应用场景示例
假设需要并发处理多个用户请求并汇总结果:
ExecutorService executor = Executors.newFixedThreadPool(3); List> futures = new ArrayList<>(); String[] users = {"A", "B", "C"}; for (String user : users) { Callable task = () -> "处理用户: " + user; futures.add(executor.submit(task)); } for (Future f : futures) { try { System.out.println(f.get()); // 输出每个任务结果 } catch (Exception e) { e.printStackTrace(); } } executor.shutdown();
基本上就这些。掌握 submit 的用法、区分 Runnable 与 Callable、正确关闭线程池,是使用 ExecutorService 的关键。实际开发中建议结合 try-finally 或 try-with-resources 确保线程池被释放。










