JUC并发包

Executor家族-AbstractExecutorServi

2020-12-22  本文已影响0人  于情于你
image.png
    该抽象类提供了ExecutorService执行方法的默认实现,此类重写了submit , invokeAny和invokeAll方法,在实现中都使用了newTaskFor方法返回RunnableFuture。(FutureTask implements RunnableFuture)。

newTaskFor和submit的方法实现如下:

protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }

public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    我们可以看到newTaskFor方法new了一个FutureTask对象返回的RunnableFuture
    如果不想用这种方式返回RunnableFuture,则可以继承AbstractExecutorService类,重写newTaskFor方法。
    比如下面CustomThreadPoolExecutor继承了ThreadPoolExecutor(ThreadPoolExecutor也是AbstractExecutorService的子类)

public class CustomThreadPoolExecutor extends ThreadPoolExecutor {

            static class CustomTask<V> implements RunnableFuture<V> {...
            }

            protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
                return new CustomTask<V>(c);
            }

            protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) {
                return new CustomTask<V>(r, v);
            }
            // ... add constructors, etc.
        }

AbstractExecutorService的所有方法如下:


image.png
上一篇下一篇

猜你喜欢

热点阅读