1. 给run()方法传参
实现的方式主要有三种
- 构造函数传参
- 成员变量传参(set)
- 回调函数传参
这里不贴具体代码。可以自行实验
2. 如何实现处理线程的返回值
2.1 主线程等待法
主线程等待法实现起来比较简单,但是必须自己实现线程等待逻辑,当需要等待的变量一多,代码会变得异常的臃肿,而且无法控制等待多久,无法精准控制
2.2 使用Thread类的join()阻塞当前线程以等待子线程处理完毕
使用join也能得到同样的结果,并且不用线程去做等待,join方法能做到比主线程等待法做到更精准的控制,实现起来更简单,但是缺点是粒度不够细,比如run方法里有循环任务,当i=5的时候需要执行别的线程任务时,无法使用join方法来控制
2.3 通过Callable接口实现: 通过FutureTask 或者通过线程池获取
2.3.1 通过Future Task获取
- 创建自定义类,实现Callable接口
- 重写call方法,并将业务逻辑写在call方法中
- 创建自定义类对象
- 创建FutureTask对象,并将callable对象传入
- 创建Thread对象,传入FutureTask对象,由于FutureTask类实现了RunnableFuture接口,RunnableFuture接口继承了Runnable接口,所以可以传入Thread对象中
- 启动线程执行任务
- 调用isDone方法判断任务是否执行完成
- 调用get()方法获取线程任务返回值
2.3.2 通过线程池获取返回值
- 创建线程池
- 往线程池提交MyCallable执行线程
- 使用isDone函数判断任务是否执行完成
- 获取线程返回值
- 关闭线程池