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<T> 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 包,用于管理线程池和异步任务执行。通过它,开发者无需手动创建和管理线程,而是将任务提交给线程池,由其自动调度执行。
使用 Executors 工厂类可以快速创建不同类型的线程池:
示例:
ExecutorService executor = Executors.newFixedThreadPool(4);
ExecutorService 支持提交 Runnable 和 Callable 类型的任务,主要方法有以下几种:
立即学习“Java免费学习笔记(深入)”;
submit(Runnable task)提交无返回值的任务,返回一个 Future> 对象,可用于判断任务是否完成。
Future<?> future = executor.submit(() -> {
System.out.println("执行无返回值任务");
});
// future.get() 可阻塞等待完成
提交任务并返回指定类型的 Future,result 作为返回值容器(适用于需要获取结果的场景)。
StringBuilder result = new StringBuilder();
Future<StringBuilder> future = executor.submit(() -> {
result.append("任务完成");
}, result);
StringBuilder res = future.get(); // 获取结果
提交有返回值的任务,Callable 的 call() 方法可返回结果或抛出异常。
Future<Integer> future = executor.submit(() -> {
return 100 + 200;
});
Integer sum = future.get(); // 获取计算结果
System.out.println("结果:" + sum);
提交任务后,合理管理线程池生命周期至关重要,避免资源泄漏。
shutdown()启动有序关闭,不再接受新任务,已提交任务会继续执行。
executor.shutdown();
尝试停止所有正在执行的任务,返回未执行的任务列表。
List<Runnable> remainingTasks = executor.shutdownNow();
配合 shutdown 使用,等待所有任务完成。
executor.shutdown();
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow(); // 超时后强制关闭
}
假设需要并发处理多个用户请求并汇总结果:
ExecutorService executor = Executors.newFixedThreadPool(3);
List<Future<String>> futures = new ArrayList<>();
String[] users = {"A", "B", "C"};
for (String user : users) {
Callable<String> task = () -> "处理用户: " + user;
futures.add(executor.submit(task));
}
for (Future<String> f : futures) {
try {
System.out.println(f.get()); // 输出每个任务结果
} catch (Exception e) {
e.printStackTrace();
}
}
executor.shutdown();
基本上就这些。掌握 submit 的用法、区分 Runnable 与 Callable、正确关闭线程池,是使用 ExecutorService 的关键。实际开发中建议结合 try-finally 或 try-with-resources 确保线程池被释放。
以上就是Java里如何使用ExecutorService提交并发任务_ExecutorService操作方法解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号