1. 前言
请先看浅谈JAVA线程池工作原理后再看本篇内容
2. 小Demo
|
相信大家都看过上面这种类型的方法, 实现了将线程池中的线程阻塞, 并且拿到了返回值.
以下代码均为伪代码,目的是提供思路
3. 分析
- 线程调用的方法需要同时支持两种类型
Callable
和Runnable
- 不能影响原有类型, 所以我们需要搞个包装类
- 经上篇分析传入的参数是保存在
Runnable
中的, 那么我们只需要在这个Runnable
外层搞个包装类,增加一个成员变量status
,就可以判断线程是否执行完成,并且可以完成如果没有完成就等待的问题 - 那么我们的返回值呢?没错, 返回值也放在包装类中, 等线程执行完返回就好!
4. 实现
4.1. 分析1
这个版本我们只实现这个线程调用的方法需要同时支持两种类型
Callable
和Runnable
4.1.1. 自定义接口
|
4.1.2. 包装类
|
4.1.3. 线程池
在上一篇的自定义线程池基础上增加了
submit
方法
|
4.2. 分析2
这个版本我们加入判断线程是否执行完的方法
4.2.1. 包装类
此处增加了线程的执行状态, 以及如果线程没执行完就死循环的方法
|
4.2.2. 线程池
之前的方法省略, 此处仅仅添加了调用的方法
|
4.3. 分析3
返回值也放在包装类中,此处需要用到泛型
4.3.1. 自定义接口
此处修改了返回值类型为泛型
|
4.3.2. 包装类
- 增加了泛型的返回值
InerCallable
调用位置也进行了修改, 直接返回null
call
方法返回后值赋值给包装类中的成员变量result
- 调用
get
方法执行完后会返回result
|