美文网首页
ExecutorService

ExecutorService

作者: 鹿小纯0831 | 来源:发表于2019-03-18 16:14 被阅读0次

    一个Executor,提供管理终止的方法和可以生成Future以跟踪一个或多个异步任务进度的方法。
    可以关闭ExecutorService,这将导致它拒绝新任务。
    提供了两种不同的方法来关闭ExecutorService:

    • shutdown方法将允许先前提交的任务在终止之前执行
    • shutdownNow方法阻止等待任务启动并尝试停止当前正在执行的任务。终止时,执行程序没有正在执行的任务,没有等待执行的任务,也没有任何新任务可以提交。 应关闭未使用的ExecutorService以允许回收其资源。

    方法submit通过创建并返回可用于取消执行和/或等待完成的Future来扩展基本方法Executor excute(Runnable)。 方法invokeAnyinvokeAll执行最常用的批量执行形式,执行一组任务,然后等待至少一个或全部完成。 (类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() { // 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();
         }
      }
    

    Callable<V>

    返回结果并可能抛出异常的任务。 实现者定义一个没有名为call的参数的方法。
    Callable接口类似于java.lang.Runnable,因为它们都是为其实例可能由另一个线程执行的类而设计的。 但是,Runnable不返回结果,也不能抛出已检查的异常。
    Executors类包含将其他常用表单转换为Callable类的实用程序方法。

    V call() throws Exception;
    

    计算结果,或者如果无法执行则抛出异常。

    Future<V>

    Future表示异步计算的结果。 提供方法以检查计算是否完成,等待其完成,以及检索计算结果。 只有在计算完成后才能使用方法get检索结果,必要时阻塞直到准备就绪。 取消由cancel方法执行。 提供了其他方法来确定任务是否正常完成或被取消。 计算完成后,无法取消计算。 如果您想使用Future以取消可取性但不提供可用的结果,您可以声明Future <?>形式的类型并返回null作为结果基本任务。

    interface ArchiveSearcher { String search(String target); }
       class App {
         ExecutorService executor = ...
         ArchiveSearcher searcher = ...
         void showSearch(final String target) throws InterruptedException {
           Future<String> future
             = executor.submit(new Callable<String>() {
               public String call() {
                   return searcher.search(target);
               }});
           displayOtherThings(); // do other things while searching
           try {
             displayText(future.get()); // use future
           } catch (ExecutionException ex) { cleanup(); return; }
         }
      }
    

    FutureTask类是实现RunnableFuture的实现,因此可以由Executor执行。 例如,submit的上述结构可以替换为:

    FutureTask<String> future =
         new FutureTask<>(new Callable<String>() {
           public String call() {
             return searcher.search(target);
         }});
       executor.execute(future);
    

    相关文章

      网友评论

          本文标题:ExecutorService

          本文链接:https://www.haomeiwen.com/subject/dutbmqtx.html