本文共 1353 字,大约阅读时间需要 4 分钟。
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();
ListshutdownNow();
方法isTerminated用于判断在关闭后所有任务是否已经全部执行完毕,如果未调用过shutdown或者shutdownNow方法,该函数的返回值不可能为true。
方法awaitTermination会一直阻塞直到所有任务已经执行完毕或者超时溢出,其源码如下:
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
方法submit向ExecutorService提交一个任务,并且返回一个Futrue对象,用于追踪任务的执行情况。
Future submit(Callable task); Future submit(Runnable task, T result);Future submit(Runnable task);
上述三个submit方法的区别在于任务执行完毕后,第一个Future.get方法返回任务执行结果,第二个Future.get方法返回给定参数result,第三个返回null。
更多方法请参见Java API。
转载地址:http://dvtmi.baihongyu.com/