2021-04-12 09:52:04

Java中高级高并发与多线程系列(三):FutureTask 类与 Callable 接口


Java中高级高并发与多线程系列(三):FutureTask 类与 Callable 接口

首先声明,本系列文章分享都是我自己的学习理解以后,原创手敲,可能包含错误的观点和理解,仅供参考,如遇错误的地方欢迎指正。

上一篇我们了解了 Thread 类与 Runnable 接口,但这两个组合有一个问题就是他们没有返回值,如果我们希望线程给我们一个返回值,那就需要今天介绍的 FutureTask 类与 Callable 接口。

多线程系列全部演示代码公开在:https://github.com/renfei/demo/tree/master/java/ConcurrentDemo

FutureTask

FutureTask 提供了对 Future 的基本实现,可以调用方法去开始和取消一个任务,可以查询任务是否完成并且获取任务结果。只有当任务完成时才能获取到任务结果,一旦任务完成,任务将不能被重启或者被取消,除非调用runAndReset方法。

FutureTask 同时还实现了 Runnable 接口,我们可以使用 Thread 实例化一个线程去执行。因为同时实现了 Runnable 和 Future,所以 FutureTask 就是一个可以得到返回值的线程。

类关系如下图:

FutureTask关系图

Callable 接口

我们在实例化 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());

完整演示代码公开在:https://github.com/renfei/demo/blob/master/java/ConcurrentDemo/src/main/java/net/renfei/demo/concurrent/CallableDemo.java


商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.renfei.net/posts/1003495
评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!

JustTes2020 2021-04-13 00:46:10 - Hefei, Anhui, China

test

回复

本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!

关注任霏博客
扫码关注「任霏博客」微信订阅号
微博:任霏博客网
Twitter:@renfeii
Facebook:任霏