一、实现Callable接口
与使用Runnable
相比,Callable
功能更强大:
- 相比于
run()
方法,call()方法可以有返回值 call()
方法可以抛出异常,被外面的操作捕获,获取异常的信息Callable
支持泛型的返回值- 需要借助
FutureTask
类,比如获取返回结果
Future
接口:
- 可以对具体
Runnable
、Callable
任务的执行结果进行取消、查询是否完成、获取结果等。 FutureTask
是Future
接口的唯一的实现类。FutureTask
同时实现了Runnable
、Future
接口,它既可以作为Runnable
被线程执行,也可以作为Future
得到Callable
的返回值。
二、代码实现
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest {
public static void main(String[] args) {
CallableThread callableThread = new CallableThread();
FutureTask futureTask = new FutureTask(callableThread);
Thread t1 = new Thread(futureTask);
t1.start();
try {
//get()方法的返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值
Object sum = futureTask.get();
System.out.println(sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class CallableThread implements Callable{
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 ==0){
System.out.println(i);
sum += i;
}
}
return sum;
}
}
- 创建一个实现
Callable
的实现类。 - 实现
call()
方法,将此线程需要执行的操作声明在call()
中。 - 创建
Callable
接口实现类的对象。 - 将此
Callable
接口实现类的对象作为传递到FutureTask
构造器中,创建FutureTask
的对象。 - 将
FutureTask
的对象作为参数传递到Thread
类的构造器中,创建Thread
对象,并调用start()
方法。