总结-2

作者: 01010100 | 来源:发表于2018-03-13 19:17 被阅读3次

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

    相关文章

      网友评论

          本文标题:总结-2

          本文链接:https://www.haomeiwen.com/subject/htktqftx.html