前言
阅读本篇文章,你需要先理解以下知识:
- 多线程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套用到线程池当中来。(点我跳转)