携带结果返回的callable任务

2018-08-30  本文已影响0人  傻不拉几二锅头

       一个"hello world"的故事

  1.代码追踪查看ExecutorService对象创建的源码如下:

2.由源码可以看出创建的是一个固定长度为1的线程池(1为我传入的数值)

3.接着去看下ThreadPoolExecutor类中的对应构造函数源码:

4.这个时间可以看到调用了另外一个构造函数,进行属性赋值操作

5.接着我们执行下面的submit(new Callable<String>)这个方法,这个时候发现调用的submit方法并不是在ThreadPoolExecutor中,而是在AbstractExecutorService中,稍微再来说这个抽象类

6.接着下去是判空校验,然后走到newTaskFor 看下做了什么事情:新建了一个futureTask类,用于执行callable这个任务

7. 在new 操作中将当前任务状态设置为NEW  任务执行之前的准备工作完成,接下来是执行

8. 从前面截图可以看到,newTaskFor(task)返回是一个RunnableFuture 查看源码可知 RunnableFuture也是一个接口,只不过集成了Runnable和future,所以找到execute(Runnable command)打上断点继续走

这个地方有几个注意点,ctl为原子操作类AtomicInteger的引用,这段代码主要内容如下:

1.检查当前正在运行线程数是否小于线程池的限制的线程数量

2.如果小于,那么启动一个新的线程以执行command。

由于callable逻辑比较简单,结果很快就出来了:

回顾看了下future.get方法:

任务只要在运行,那么就会走到awaitDone这个方法,线程将会一直等待计算结束会抛出异常,最后将结果存入outcome这个字段中返回。

大致的类图画了下,觉得源码可以去看看,比较有意思的

上一篇下一篇

猜你喜欢

热点阅读