美文网首页
关于SingleThreadExecutor以及Finaliza

关于SingleThreadExecutor以及Finaliza

作者: 大侠陈 | 来源:发表于2019-01-07 20:30 被阅读7次

关于SingleThreadExecutor以及FinalizableDelegatedExecutorService

Executors.newSingleThreadExecutor方法用于创建只用单个线程处理任务的线程池,此方法是一个静态方法,具体代码如下

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

从代码中实例化线程池的部分可以看出它是一个线程数量默认大小和最大大小都为1的线程池

new ThreadPoolExecutor(1, 1,

0L, TimeUnit.MILLISECONDS,

new LinkedBlockingQueue<Runnable>())new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>())

跟 Executors.newFixedThreadPool(1) 差不多的效果。

然而newFixedThreadPool不一样的是newSingleThreadExecutor创建的线程池又被一个FinalizableDelegatedExecutorService包装了一下,如果不看FinalizableDelegatedExecutorService中的源代码会让人不明白在这是干啥用的。

FinalizableDelegatedExecutorService的代码如下

    static class FinalizableDelegatedExecutorService
        extends DelegatedExecutorService {
        FinalizableDelegatedExecutorService(ExecutorService executor) {
            super(executor);
        }
        protected void finalize() {
            super.shutdown();
        }
    }

它很简单, 只是继承了DelegatedExecutorService类并增加了一个finalize方法,finalize方法会在虚拟机利用垃圾回收清理对象时被调用,换言之,FinalizableDelegatedExecutorService的实例即使不手动调用shutdown方法关闭现称池,虚拟机也会帮你完成此任务,不过从严谨的角度出发,我们还是应该手动调用shutdown方法,毕竟Java的finalize不是C++的析构函数,必定会被调用,Java虚拟机不保证finalize一定能被正确调用,因此我们不应该依赖于它。

再来看看DelegatedExecutorService,源代码如下

    static class DelegatedExecutorService extends AbstractExecutorService {
        private final ExecutorService e;
        DelegatedExecutorService(ExecutorService executor) { e = executor; }
        public void execute(Runnable command) { e.execute(command); }
        public void shutdown() { e.shutdown(); }
        public List<Runnable> shutdownNow() { return e.shutdownNow(); }
        public boolean isShutdown() { return e.isShutdown(); }
        public boolean isTerminated() { return e.isTerminated(); }
        public boolean awaitTermination(long timeout, TimeUnit unit)
            throws InterruptedException {
            return e.awaitTermination(timeout, unit);
        }
        public Future<?> submit(Runnable task) {
            return e.submit(task);
        }
        public <T> Future<T> submit(Callable<T> task) {
            return e.submit(task);
        }
        public <T> Future<T> submit(Runnable task, T result) {
            return e.submit(task, result);
        }
        public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
            throws InterruptedException {
            return e.invokeAll(tasks);
        }
        public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                             long timeout, TimeUnit unit)
            throws InterruptedException {
            return e.invokeAll(tasks, timeout, unit);
        }
        public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
            throws InterruptedException, ExecutionException {
            return e.invokeAny(tasks);
        }
        public <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                               long timeout, TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException {
            return e.invokeAny(tasks, timeout, unit);
        }
    }

它也是一个线程池,确切的说是线程池的一个代理模式的实现,对它所有方法的调用其实是被委托到它持有的目标线程池上,不过它的功能是被阉割的, 因为他只实现并委托了部分方法,真实线程池存在的那些未被委托的方法在这里将无法使用。

综上所述newSingleThreadExecutor创建的线程池是一个

  1. 单线任务处理的线程池
  2. shutdown方法必然会被调用
  3. 不具备ThreadPoolExecutor所有功能的线程池

相关文章

  • 关于SingleThreadExecutor以及Finaliza

    关于SingleThreadExecutor以及FinalizableDelegatedExecutorServi...

  • 线程的启动方式以及SingleThreadExecutor

    启动线程方式一: 线程可以驱动任务,因此需要一种描述任务的方式,可以由Runnable接口来提供,要想定义任务,只...

  • ExecutorService_NewSingleThreadE

    任务是顺序执行的,SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成,...

  • 日常胡言乱语

    那些虚无的若有似无的惆怅 关于梦想以及怀念 关于所有的不可得以及所有的失去 关于为何生,以及继续的意义 喝了许多的...

  • 关于酒,关于戒酒以及借口

    文/王志刚(预计阅读时间4分钟) 记不清这是第几次宿醉了,总之醒来之后被呕吐物沾染的衣服,以及胃部强烈的不适,都在...

  • 关于时间,以及当下

    文/何怡萱 关于时间这个话题,我们每个人都有太多的话想去感慨,上了初中,我也慢慢开始感悟到时间一分一秒的流过...

  • 关于死亡以及铭记

    很巧的是,前一段时间,四处都在掀起纪念汶川地震十周年的活动,为死者哀悼,为存者铭记。也许,是因为,事故发生的时候我...

  • 关于爱以及无奈

    “若我的爱能给他幸福,拼命也要给他。 可如果我这爱成了他的负担只能带给他不幸,适时地舍弃,才是保全我爱情的最佳方法...

  • 关于崇拜以及自恋

    // 小时候感觉没有偶像很不cool,于是声称我的偶像是吴尊(后来改成了胡歌 现在倒是不会把“欣赏的男艺人”跟“爱...

  • 关于读书以及讲座

    刚才听了下王俊煜的阅读清单打造法,听他说了些老掉牙的东西,例如使用app阅读,清单式阅读,多做(无用的)笔记,读付...

网友评论

      本文标题:关于SingleThreadExecutor以及Finaliza

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