Java多线程与并发-8.4 如何实现处理线程的返回值

我们知道给run方法传参有三种方式,即:

  • 构造函数传参
  • 成员变量传参
  • 回调函数参数

如何实现处理线程的返回值?
关于线程的返回值,就是一个痛点了。因为我们有的程序的执行,是依赖于子任务的返回值进行的,当子任务交由子线程去执行的时候,是需要获取到它们的返回值的,这个时候怎么办?即实现子任务的返回值的方法是什么?
实现的方式主要有3种:
(1)主线程等待法,即我们可以让主线程循环等待,直到目标子线程返回结果为止。
先看下没有等待的时候,执行结果是怎样的:
Java多线程与并发-8.4 如何实现处理线程的返回值_第1张图片
从这个结果可以知道,按照原来这种多线程的方式,我们并不能精准的控制等待我们的子任务返回结果的时候才去执行下一个语句。也就是说,我们的主线程在调用start方法去执行多线程之后,就马上去执行打印语句了,此时value还没有赋值,我们不能得到子任务的返回值。
那如何去依赖子线程的返回值呢?我们可以利用主线程等待法,如下:
Java多线程与并发-8.4 如何实现处理线程的返回值_第2张图片
主线程等待法,实现起来比较简单,缺点是需要自己实现循环等待的逻辑,当需要等待的变量一多,代码便会显得异常的臃肿,并且,需要循环多久是不确定的,没法做到精准的控制。
(2)使用Thread类的join()阻塞当前线程以等待子线程处理完毕。
Java多线程与并发-8.4 如何实现处理线程的返回值_第3张图片
join方法能做到比主线程等待法更精准的控制,实现起来更简单,但缺点是它的粒度不够细。
(3)通过Callable接口实现:通过FutureTask 或者 线程池获取。
第一种:通过FutureTask获取返回值
新建一个Callable接口实现类,命名为MyCallable,

package thread;

import java.util.concurrent.Callable;

public class MyCallable implements Callable{
	@Override
	public String call() throws Exception {
		String value = "test";
		System.out.println("Ready to work");
		Thread.currentThread().sleep(5000);
		System.out.println("task done");
		return value;
	}
}

然后新建一个测试类:
Java多线程与并发-8.4 如何实现处理线程的返回值_第4张图片
第二种:通过线程池获取
Java多线程与并发-8.4 如何实现处理线程的返回值_第5张图片
使用线程池的好处是,我们可以提交多个实现了Callable接口的类,去让线程池并发地处理结果,这样就可以方便我们对这些Callable类的执行方式做统一管理。

你可能感兴趣的:(Java,Java必备知识)