实例带你获取多线程Thread的返回值之 (壹) - Callable的运行

前言

阅读本篇文章,你需要先理解以下知识:

  • 多线程Thread的基本使用 (点我跳转
  • extends和implements
  • 重写Override
  • try catch错误处理
  • Java基础知识

回顾

回顾一下我们学过的Thread多线程,是继承了一个Thread类,然后调用run()方法来执行定义的类。

那么问题来了,有时候我们需要多线程传回一个计算的值给我们,Callable就很好地解决了我们的需求。

拷贝

在你的IDE中新建一个项目或一个类,并将类命名为CallableDemo,然后拷贝下面这些代码:

 1import java.util.concurrent.Callable;
 2import java.util.concurrent.ExecutionException;
 3import java.util.concurrent.FutureTask;
 4
 5public class CallableDemo {
 6    public static void main(String[] args) {
 7        //实例化当前类
 8        CallableDemo callableDemo = new CallableDemo();
 9        //调用动态类
10        callableDemo.run();
11    }
12
13    public void run() {
14        ThreadC threadC = new ThreadC();
15        //使用FutureTask接收Callable运行的结果
16        FutureTask futureTask = new FutureTask(threadC);
17        //启动线程
18        new Thread(futureTask).start();
19        //获取返回结果
20        try {
21            Object ret = futureTask.get();
22            System.out.println("获得返回结果: " + ret);
23        } catch (InterruptedException | ExecutionException e) {
24            System.out.println("获取结果出错");
25        }
26    }
27}
28
29class ThreadC implements Callable {
30    @Override
31    public Object call() throws Exception {
32        String a = "WeChat: 1101635162";
33        return a;
34    }
35}

让我们无视掉主方法,它用于实例化当前类并调用动态的run()方法。将注意力转移到run()方法和ThreadC类。

继承了Callable接口的类

1class ThreadC implements Callable {
2    @Override
3    public Object call() throws Exception {
4        String a = "WeChat: 1101635162";
5        return a;
6    }
7}

可以看到,我们的ThreadC类继承了Callable接口,且重写了Callable接口的call()方法,使其返回一串字符串。

调用方法

 1    public void run() {
 2        ThreadC threadC = new ThreadC();
 3        //使用FutureTask接收Callable运行的结果
 4        FutureTask futureTask = new FutureTask(threadC);
 5        //启动线程
 6        new Thread(futureTask).start();
 7        //获取返回结果
 8        try {
 9            Object ret = futureTask.get();
10            System.out.println("获得返回结果: " + ret);
11        } catch (InterruptedException | ExecutionException e) {
12            System.out.println("获取结果出错");
13        }
14    }

在该方法中,我们实例化了ThreadC。与普通的Thread不同的是我们使用了FutureTask类。该类用来接收Callable的返回结果。

剩下的代码便很好理解了,获取结果并输出。

运行!

现在让我们运行该类,并查看结果:

1获得返回结果: WeChat: 1101635162

后语

本篇文章描述了简单的Callable使用方法,下一章我们将把Callable套用到线程池当中来。(点我跳转

如转载请在文章尾部添加

原作者来自 adlered 个人技术博客:https://www.stackoverflow.wiki/

    评论
    0 评论
avatar

取消