接口Executor:

一个可以执行被提交的Runnable的对象。该接口提供了一种任务提交的解耦方案,体现在每个task如何运行,使用,调度等。
Executor接口并不严格要求task的执行过程是异步的,在最简单的情况下,一个Executor可以直接将task放在调用者的线程中执行:

  1. class DirectExecutor implements Executor{
  2. public void execute(Runnable r){
  3. r.run();
  4. }
  5. }

但更常见的情况一般是:task会被放置在其他线程而非调用者线程执行。
许多Executor接口的实现会给task如何以及何时被调用加上限制。

  1. void execute(Runnable command);

Runnable可在新线程,线程池,或者调用者线程执行。

接口ExecutorService(Executor的拓展)

是一个提供了termination和返回Future来追踪一个或多个异步tasks的对象。

termination:指executor没有正在执行的task,没有等待执行的task,且没有新的task可以被接收。

shutdown();新的task不再被接收,已提交的task会执行完毕,重复调用该方法没有其他效果。该方法不会阻塞调用者线程来等待task去执行完毕,若要阻塞当前线程,该调用awaitTermination();

shutdownNow();尝试停止所有正在执行的task,停止正在等待的task,返回等待执行的task的List。但并不保证能成功停止正在执行的线程,因为该方法的实现一般就是用Thread#interrupt(),那么就要求线程本身就能正确根据interrupt()方法来停止自身。

isShutdown()返回true如果调用过shutdown()或者shutdownNow()

isTerminated();如果全部task都在调用shutdown()后完成了,将返回true,若调用isTerminated()之前没有调用过shutdown()shutdownNow(),该方法永远返回false。

awaitTermination(long timeout,Timeunit unit) throws InterruptedExeption; 阻塞调用者的线程,直到所有task在shutdown后完成,或者timeout超时,或者当前线程被interrupted。

Future<T> submit(Callable<T>)提交一个有返回值的任务(Callble)并返回一个Future对象。可通过Future#get()来返回任务处理完成的结果。若要为获取一个任务的执行结果而阻塞当前调用者线程,可以

  1. result=exec.submit(aCallable).get();