| java.util.concurrent public interface ExecutorService |
| extends Executor |
一个Executor ,它提供了管理终止的方法和可以生成Future以跟踪一个或多个异步任务的进度的方法。
可以关闭ExecutorService ,这将导致它拒绝新任务。提供了两种不同的方法来关闭ExecutorService 。 shutdown方法将允许先前提交的任务在终止之前执行,而shutdownNow方法阻止等待的任务启动并尝试停止当前正在执行的任务。终止后,执行者没有正在执行的任务,没有等待执行的任务,也没有新的任务可以提交。应关闭未使用的ExecutorService以允许回收其资源。
方法submit通过创建和返回可用于取消执行和/或等待完成的Future扩展了基本方法Executor.execute(Runnable) 。方法invokeAny和invokeAll执行最常用的批量执行形式,执行一组任务,然后等待至少一个或全部完成。 (类ExecutorCompletionService可用于编写这些方法的自定义变体。)
Executors类为此包中提供的执行器服务提供工厂方法。
使用示例
这是一个网络服务的草图,其中线程池中的线程为传入请求提供服务。它使用预配置的Executors.newFixedThreadPool工厂方法:
| class NetworkService implements Runnable { |
| private final ServerSocket serverSocket; |
| private final ExecutorService pool; |
| public NetworkService(int port, int poolSize) |
| throws IOException { |
| serverSocket = new ServerSocket(port); |
| pool = Executors.newFixedThreadPool(poolSize); |
| } |
| public void run() { |
| try { |
| for (;;) { |
| |
| pool.execute(new Handler(serverSocket.accept())); |
| } |
| } catch (IOException ex) { |
| pool.shutdown(); |
| } |
| } |
| } |
| class Handler implements Runnable { |
| private final Socket socket; |
| Handler(Socket socket) { this.socket = socket; } |
| public void run() { |
| |
| } |
| } |
以下方法分两个阶段关闭ExecutorService ,首先调用shutdown拒绝传入任务,然后调用shutdownNow (如有必要)取消任何延迟任务:
| void shutdownAndAwaitTermination(ExecutorService pool) { |
| pool.shutdown(); |
| try { |
| |
| if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { |
| pool.shutdownNow(); |
| |
| if (!pool.awaitTermination(60, TimeUnit.SECONDS)) |
| System.err.println("Pool did not terminate"); |
| } |
| } catch (InterruptedException ie) { |
| |
| pool.shutdownNow(); |
| |
| Thread.currentThread().interrupt(); |
| } |
| } |
内存一致性效果:在将Runnable或Callable任务提交给ExecutorService之前线程中的操作发生在该任务采取的任何操作之前,而这反过来又发生在通过Future.get()检索结果之前。
关注我的公众号SpaceObj 领取idea系列激活码

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)