1.Callable是干什么用的?
前一个章节关于线程池的,但是小伙伴们有没有发现,这些线程池虽然能正常跑线程,但如果遇到获取每个线程执行后返回的值时就显得力不从心了。Future中的参数Runnable也不能返回线程返回的值,因为它是void类型的返回值。所以如果要获取线程执行后返回的值就要靠Callable了。
2.直接上代码:
/**
* Created by
* Date : 2018/7/19 17:20
*/
public class Main {
public static void main(String[] args){
ExecutorService executorService= Executors.newCachedThreadPool();
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
List<Future<String>> resultList=new CopyOnWriteArrayList<>();
for(int i=0;i<list.size();i++){
final int index=list.get(i);
resultList.add(executorService.submit(new Callable<String>(){
@Override
public String call(){
return "返回值"+index;
}
})
);
}
for(Future future:resultList){
try{
System.out.println(future.get());
}catch (Exception e){
e.printStackTrace();
}
}
}
}
执行结果:
返回值1
返回值2
返回值3
返回值4
返回值5
从结果看出来,Callable里面的call()方法结果被得到并返回了。