实现了Executor.提供了方法来管理终端,同时能生成Future对象来跟踪一个或多个异步任务过程。
一个ExecutorService可以被关闭,这将导致它拒绝接收新任务。关闭一个ExcutorService有两个方法,shutDown在结束之前允许已提交的任务继续执行,而shutDownnow拒绝等待。结束之后,一个ExecutorService没有正在执行的任务,没有正在等待的任务,无法接收新任务。一个不再使用的ExecutorService应该被关闭,以允许它使用的资源被重新分配。
submit方法扩展了execute方法,返回Future对象以允许取消执行或等待完成之后。
invokeAny和invokeAll执行了最常被用到的大量任务的执行,等待至少一个或全部执行完毕。
可使用ExecutorCompletionService来编写这类方法的自定义变体)。
Executors 这个类提供该包中服务类的工厂方法。
下面是一个网络服务的例子,线程池的线程作为传入的请求。它使用了预先配置好的Executors newFixedPool工厂方法。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class NetworkService implements Runnable {
private ServerSocket serverSocket;
private ExecutorService pool;
public NetworkService(int port,int poolSize) throws IOException{
serverSocket=new ServerSocket(port);
pool=Executors.newFixedThreadPool(poolSize);
}
@Override
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
}
}
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
}