Executor和ExecutorService

来源:互联网 发布:闹钟软件 编辑:程序博客网 时间:2024/05/21 09:39

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。


0 0
原创粉丝点击