创建执行线程的方式一共有四种:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
- 使用线程池
1. 创建执行线程的方式三:实现Callable接口
此种方式相比于实现Runnable接口的方式:
- 可以有返回值
- 可以抛出异常
执行Callable方式,需要FutureTask 实现类的支持,用于接收运算结果。FutureTask 是 Future 接口的实现类。
代码语言:javascript复制package com.pyy.juc;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class TestCallable {
public static void main(String[] args) {
ThreadCallableDemo tcd = new ThreadCallableDemo();
// 执行Callable方式,需要FutureTask 实现类的支持,用于接收运算结果。
FutureTask<Integer> result = new FutureTask<>(tcd);
new Thread(result).start();
// 获取线程执行后的结果
try {
Integer sum = result.get();
System.out.println(sum);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
class ThreadCallableDemo implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = 0; i <= 100; i ) {
sum = i;
}
return sum;
}
}
通过上面案例发现FutureTask 也可实现 闭锁
效果,用于一些结果的运输。
使用场景: 在多个微服务场景下,一个方法需要调用多个服务获取结果,并将结果组合起来,最终返回给前台。此时如果采用原始同步方式调用服务,总耗时=每个服务方法耗时 * 调用服务个数。 此时如果才使用FutureTask Callable方式实现,就可以实现并发访问,总耗时=多个线程中耗时最大的一个线程的时间。