首先声明,本系列文章分享都是我自己的学习理解以后,原创手敲,可能包含错误的观点和理解,仅供参考,如遇错误的地方欢迎指正。
上一篇我们了解了 Thread 类与 Runnable 接口,但这两个组合有一个问题就是他们没有返回值,如果我们希望线程给我们一个返回值,那就需要今天介绍的 FutureTask 类与 Callable 接口。
多线程系列全部演示代码公开在:https://github.com/renfei/demo/tree/master/java/ConcurrentDemo
FutureTask 提供了对 Future 的基本实现,可以调用方法去开始和取消一个任务,可以查询任务是否完成并且获取任务结果。只有当任务完成时才能获取到任务结果,一旦任务完成,任务将不能被重启或者被取消,除非调用runAndReset方法。
FutureTask 同时还实现了 Runnable 接口,我们可以使用 Thread 实例化一个线程去执行。因为同时实现了 Runnable 和 Future,所以 FutureTask 就是一个可以得到返回值的线程。
类关系如下图:
我们在实例化 FutureTask 的时候需要传入一个实现了 Callable 接口的类,Callable 中有 call() 方法,FutureTask 其实就是调用我们的 call() 方法得到返回值的。
实际编码感受一下
首先,我们编写一个实现了 Callable 接口的类,构造函数传入一个名字,然后打印10次并返回 100 作为结果:
class MyCallable implements Callable<Integer> {
private String myName;
public MyCallable(String name) {
this.myName = name;
}
@Override
public Integer call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(this.myName + " :: 打印 i = " + i);
}
return 100;
}
}
然后,实例化线程并启动线程,获得返回值:
FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable("我们实现的Callable"));
Thread threadA = new Thread(futureTask);
threadA.start();
System.out.println("main 获得线程返回的值:" + futureTask.get());
商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.renfei.net/posts/1003495
本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!
本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!