总结-2
Concurrent
6、Executor,ExecutorService Callable,Future, FutureTask
Executor:
void execute(Runnable command) 提交任务
public interface ExecutorService extends Executor:
void shutdown():不接受新任务,但是会执行完已提交的任务
List shutdownNow():不接受新任务,并不执行队列中的任务。返回值:未开始执行的任务。
Future<T> submit(Callable<T> task); 任务执行成功后,Future.get()获取任务返回值。
Future<?>submit(Runnable task);任务执行成功后,Future.get()将返回null。
来看看submit是怎么实现的:
AbstractExecutorService extends ExecutorService:
Future<T> submit(Callable<T> task):
RunnableFutureftask = newTaskFor(task); -> new FutureTask(callable);
execute(ftask);
return ftask;
上面可以看出,submit最终还是将任务ftask提交给execute去处理了,并立即new一个FutureTask返回。在线程池的execute里,我们知道会调用ftask的run方法再看下FutureTask发现,其同时继承了Runnable和Future,在FutureTask的run方法中,最终调用了传入的Callable task的call方法。在call方法执行完后,将结果保存至FutureTask Sync的result属性。再来看看FutureTask获取结果的get,若当前run方法未执行完,则阻塞,否则返回结果result。
总结一下:submit -> execute -> run -> call
Callable:与Runnable很类似,但是Runnable run方法没有返回值并且不能抛出受检异常V call() throws ExceptionFuture:
V get()
V get(long timeout, TimeUnit unit)
boolean isDone();
boolean isCancelled();
FutureTask implements RunnableFuture
RunnableFuture extends Runnable, Future
FutureTask既实现了Runnable,又实现了Future,通过内部实现一个AQS锁来处理多线程的并发及阻塞操作。