2020-04-03:想要复习一下旧知识,今天初略的回顾了一遍,发现居然看不懂写的是什么了,理科生这语言功底让人脸红耳热...,看看能不能动手加点修饰
目录
1.是什么?
答:(先大胆发表想法) 这里用抽象类封装 submit 操作方法,而对线程的执行操作:【
execute,shutdown,isShutdown,awaitTermination
】让继承的类必须去具体实现:
- 规范和方便了线程池的调用
- 提供外部扩展自定义线程池模版,
2.能干什么?
说实话,使用JDK开发,并且需要自定义一个线程池,那你就需要继承这个抽象类,实现里面execute..等操作线程方法
3.本身做了些什么?
就是提供了一个空架子,一个开关,一个调用线程池内部线程的开关
下面来看看这里面到底有些什么鬼东西?
1. submit invokeAny invokeAll 方法是对ExecutorService接口中方法的实现,newTaskFor doInvokeAny方法是新增方法
- protected--newTaskFor(Runnable,T) -- 提交一个任务,调用的是FutureTask类,返回RunnableFuture
,内部最终运行线程的功能是在Executors 类的内部类中实现 ---jdk1.6有改动 - protected--newTaskFor(Callable<T> callable) -- 基本与上面类似,就是FutureTask构造方法更加简单this.callable=callable --- jdk1.6有改动
- 看了第一个submit的内部实现,我明白了
- 为什么这里要设计 一个RunnableFuture接口?
- 为什么 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-->