让多线程有返回值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lj_dreamone/article/details/84565981

Runnable,该接口的run方法并无返回值。而Callable的call方法可以根据你传入的泛型参数返回对应类型的数据。

public class TaskCallable implements Callable<String>{
    private int id;
    public TaskCallable(int id){
        this.id = id;
    }
    @Override
    public String call() throws Exception {
        
        return "result of taskWithResult "+id;
    }
}

2.将该任务交给线程执行者executor,让他来代理执行这些线程

ExecutorService exec = Executors.newCachedThreadPool();//工头
ArrayList<Future<String>> results = new ArrayList<Future<String>>();//
for(int i = 0 ; i < 10 ;i++){
    results.add(exec.submit(new TaskCallable(i)));//submit返回一个Future,代表了即将要返回的结果
}

  注意,此时需要使用executor的submit方法来调用Callable的call。

  该方法将返回一个Future接口的对象,它的泛型参数代表了call方法要返回的参数类型。

  3.Future类型

  简单的了解了下Future类型:按照名字判断该类型对象代表了线程执行完成后的结果,所以叫Future。那么在获取该类型存放的线程运行结果时,可能该线程并未运行完毕,所以称其为“将来的结果”。

  •   首先,可以用isDone()方法来查询Future是否已经完成,任务完成后,可以调用get()方法来获取结果
  •     如果不加判断直接调用get方法,此时如果线程未完成,get将阻塞,直至结果准备就绪

猜你喜欢

转载自blog.csdn.net/lj_dreamone/article/details/84565981