java线程八之Callable

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()方法结果被得到并返回了。

猜你喜欢

转载自blog.csdn.net/wangzx19851228/article/details/81119698