概述
引入
上面我们说了Runnable
,因为Runnable
无法返回数据,导致使用不便。所以我们此次介绍另一个用来实现将我们的代码封装交给Thread
的接口,此接口允许我们返回操作结果。
摘要
介绍Callable
接口的定位、使用场景及注意事项。
类介绍
类定位
用于在多线程编程中封装子线程的业务逻辑时使用,不负责创建子线程,只用于在Thread
执行时起统一接口作用。
注意
相对于Runnable
接口,Callable
接口增加了一些东西:
- 允许有返回的结果
- 允许抛出检查异常
源码解读
没得说。
使用示例
示例
因为Callable
有返回值,所以使用Thread
是不行的。我们使用FutureTask
进行一层适配,因为它同时实现了Future
接口和Runnable
接口,具体细节我们在后面详述。
/**
* @author lipengcheng3 Created date 2019-02-13 10:05
*/
public class FutureLearn {
static class TestCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 10; i++) {
Thread.sleep(100);
sum += i;
}
return sum;
}
}
public static void main(String[] args) {
FutureTask<Integer> t1 = new FutureTask<>(new TestCallable());
new Thread(t1).start();
try {
System.out.println(t1.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
使用思路
很多多线程框架不支持 Callable
可以借助 RunnableFuture
网友评论