java进阶-线程池 - B - 1 -作为所有线程池的父类,AbstractExecutorService抽象类有话要说

20 篇文章 0 订阅

2020-04-03:想要复习一下旧知识,今天初略的回顾了一遍,发现居然看不懂写的是什么了,理科生这语言功底让人脸红耳热...,看看能不能动手加点修饰

目录

1.是什么?

2.能干什么?

3.本身做了些什么?


1.是什么?

答:(先大胆发表想法) 这里用抽象类封装 submit 操作方法,而对线程的执行操作:【

execute,shutdown,isShutdown,awaitTermination

】让继承的类必须去具体实现:

  1. 规范和方便了线程池的调用
  2. 提供外部扩展自定义线程池模版

 

2.能干什么?

说实话,使用JDK开发,并且需要自定义一个线程池,那你就需要继承这个抽象类,实现里面execute..等操作线程方法

 

3.本身做了些什么?

就是提供了一个空架子,一个开关,一个调用线程池内部线程的开关

下面来看看这里面到底有些什么鬼东西?

1. submit invokeAny invokeAll 方法是对ExecutorService接口中方法的实现,newTaskFor doInvokeAny方法是新增方法

  1. protected--newTaskFor(Runnable,T)  --  提交一个任务,调用的是FutureTask类,返回RunnableFuture
    ,内部最终运行线程的功能是在Executors 类的内部类中实现  ---jdk1.6有改动
  2. protected--newTaskFor(Callable<T> callable) -- 基本与上面类似,就是FutureTask构造方法更加简单this.callable=callable   --- jdk1.6有改动
  3. 看了第一个submit的内部实现,我明白了
    1. 为什么这里要设计 一个RunnableFuture接口?
    2. 为什么 Executor接口 的execute方法入参是Runnable,却能在后面实现callable传入并且有返回值?

 我这一眼看下来,这里加入了2个转接器

一个是FutureTask类构造方法能接收runnable/callable 

一个是 RunnableFuture ,继承了Future 和 runnable,既能够作为一个runnable被execute执行,又能够作为一个Future 控制线程

然后这个submit的实现细节全在FutureTask  和 ThreadPoolThread的execute方法(看我下篇文章的execute详细介绍) 

   4. 其他几个submit,没什么花头,讲下 private-doInvokeAny方法吧!-- 这里涉及到CompletionService知识

代码结合流程图解释一波 (这种大批量没创新的东西是我最不喜欢放博客上的,以后争取不出现)

    ...
        try {
            ExecutionException ee = null;
            final long deadline = timed ? System.nanoTime() + nanos : 0L;
            Iterator<? extends Callable<T>> it = tasks.iterator();
            futures.add(ecs.submit(it.next()));
            --ntasks;
            int active = 1;

            for (;;) {
                Future<T> f = ecs.poll();
                if (f == null) {
                    if (ntasks > 0) {
                        --ntasks;
                        futures.add(ecs.submit(it.next()));
                        ++active;
                    }
                    else if (active == 0)
                        break;
                    else if (timed) {
                        f = ecs.poll(nanos, TimeUnit.NANOSECONDS);
                        if (f == null)
                            throw new TimeoutException();
                        nanos = deadline - System.nanoTime();
                    }
                    else
                        f = ecs.take();
                }
                if (f != null) {
                    --active;
                    try {
                        return f.get();
                    } catch (ExecutionException eex) {
                        ee = eex;
                    } catch (RuntimeException rex) {
                        ee = new ExecutionException(rex);
                    }
                }
            }

            if (ee == null)
                ee = new ExecutionException();
            throw ee;

        } finally {
            for (int i = 0, size = futures.size(); i < size; i++)
                futures.get(i).cancel(true);
        }
   

 

5.  List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) 的实现细节

      先是将tasks里面的所有任务全都提交上去 , 在遍历每一个任务,某一个未完成就等待直到完成。   过程中线程池出问题忽略,返回futures

6. List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

     在第5条基础上加入了超时机制!

东西也不多的,都走一遍再看接下来的我们最常用的 "吃饭的家伙" 就很简单了!next-->

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值