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()检索结果之前。
|