ExecutorService 类图
ExecutorService被终止后,会拒绝执行新的任务。ExecutorService提供了2个终止方法:
-
shutdown()
方法将会在终止之前执行预先制定好要提交的任务。 -
shutdownNow()
方法阻止等待执行的任务,并尝试终止正在执行的任务。
ExecutorService终止后,executor不会有要执行的任务,不会有等待执行的任务,也不会没有被提交的任务。没有被使用的ExectorService应该被终止,以此来释放其占用的资源。
submit
方法通过创建并返回Future
来扩展Exector.execute(Runnable)
方法,Futrue
可以用来取消执行或等待完成的任务。invokeAny
和invokeAll
是最常见的用来批量执行任务的方法,它们通常执行一组任务,然后等待至少一个或者全部任务完成。
Executors
类为这个包中的executor服务提供工厂方法。
下面的代码展示了在网络服务中使用线程池中的线程来接受网络请求的情形。代码中使用了Executors
已经写好的方法 executor.newfixedthreadpool (int)
:
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() {
// read and service request on socket
}
}
下面的方法分两个阶段关闭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();
}
}