JDK7中ExecutorService源码概述

来源:互联网 发布:用js怎么写九九乘法表 编辑:程序博客网 时间:2024/06/07 15:20
ExecutorService是java.util.concurrent包下的接口(public interface ExecutorService extends Executor),所有已知子接口:ScheduledExecutorService,所有已知实现类:AbstractExecutorService,ScheduledThreadPoolExecutor,ThreadPoolExecutor。
    

Executor提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future的方法。可以关闭ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭ExecutorService。shutdown()方法在终止前允许执行以前提交的任务,而shutdownNow()方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的ExecutorService以允许回收其资源。通过创建并返回一个可用于取消执行和/或等待完成的Future,方法submit扩展了基本方法Executor.execute(java.lang.Runnable)。方法invokeAny和invokeAll是批量执行的最常用形式,它们执行任务collection,然后等待至少一个,或全部任务完成(可使用ExecutorCompletionService类来编写这些方法的自定义变体)。


Executors类提供了用于此包中所提供的执行程序服务的工厂方法。

下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的Executors.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() { // run the service
   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(); // 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();
 }
}
 
内存一致性效果:线程中向ExecutorService提交Runnable或Callable任务之前的操作happen-before由该任务所提取的所有操作,后者依次happen-before通过Future.get()获取的结果。

实现可参考:https://github.com/chunericli/wise-utils
原创粉丝点击