Executor和ExecutorService

Executor

Executor用来执行已提交的Runnable任务,该接口将任务的提交与具体执行进行了解耦。它通常用来代替显示地创建线程,例如:

Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());

而不是使用new Thread(new RunnableTask()).start()。

然而,该接口并不严格要求任务的执行是异步的,在最简单的情况下,任务的执行是在调用者线程上:

class DirectExecutor implements Executor {
   public void execute(Runnable r) {
     r.run();
  }
}

更典型的情况是,任务是在其它线程上执行,比如线程池。

该接口只有一个方法,如下:

void execute(Runnable command);

该方法的作用是提交一个任务,这个任务在未来的某一时刻会被执行,该任务可能被新的线程执行,可能线程池中的线程执行,可能在提交者自身的线程执行。


ExecutorService

ExecutorService继承于Executor,并提供了管理任务的终止,以及产生可以追踪一个或多个异步任务进程的Future的方法。

ExecutorService提供了两个不同的关闭方法——那将引起拒绝接受新任务,shutdown方法允许在终止前继续执行之前已提交的任务,shutdownNow方法将阻止等待任务执行并尝试停止正在执行的任务,并且返回等待执行任务的列表。源码如下:

void shutdown();
List<Runnable> shutdownNow();

方法isTerminated用于判断在关闭后所有任务是否已经全部执行完毕,如果未调用过shutdown或者shutdownNow方法,该函数的返回值不可能为true。

方法awaitTermination会一直阻塞直到所有任务已经执行完毕或者超时溢出,其源码如下:

boolean awaitTermination(long timeout, TimeUnit unit)
         throws InterruptedException;

方法submit向ExecutorService提交一个任务,并且返回一个Futrue对象,用于追踪任务的执行情况。

<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);

上述三个submit方法的区别在于任务执行完毕后,第一个Future.get方法返回任务执行结果,第二个Future.get方法返回给定参数result,第三个返回null。

更多方法请参见Java API。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值