总结-2

2018-03-13  本文已影响3人  01010100

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锁来处理多线程的并发及阻塞操作。

上一篇下一篇

猜你喜欢

热点阅读