在创建线程时,前面都是通过Thread,Runnable接口来创建的,这样创建的线程的入口函数,run方法是没有返回值的,如果我们需要线程返回一个值,就需要使用Callable接口来创建线程.
创建实例:
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= 1000; i++) {
sum += i;
}
return sum;
}
};
callable在创建时需要传入一个泛型类,这个泛型类就是我们所需要的返回值类型.
callable创建线程:
Callable对象不能直接传入Thread使用,需要配合FutureTask来使用.
![]()
直接传入报错,因为Thread的构造方法没有提供这个版本.
正确使用:先将callable对象传入FutureTask中,再将FutureTask对象传入Thread.
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= 1000; i++) {
sum += i;
}
return sum;
}
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread t = new Thread(futureTask);
t.start();
FutureTask也需要传入泛型类,和callable传入的泛型类相同即可.
获取返回值
引入Callable就是为了解决Runnable接口无法返回的问题,想要获取返回值,只需要使用FutureTask提供的get方法即可,get方法会阻塞等待线程完成任务,然后拿到返回值
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= 1000; i++) {
sum += i;
}
return sum;
}
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread t = new Thread(futureTask);
t.start();
System.out.println(futureTask.get());
}

执行结果正确.
732

被折叠的 条评论
为什么被折叠?



