美文网首页
携带结果返回的callable任务

携带结果返回的callable任务

作者: 傻不拉几二锅头 | 来源:发表于2018-08-30 22:02 被阅读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这个字段中返回。

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

    相关文章

      网友评论

          本文标题:携带结果返回的callable任务

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