一个"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这个字段中返回。
大致的类图画了下,觉得源码可以去看看,比较有意思的
网友评论