1. Runnable是执行工作的独立任务,但它不返回任何值。
2. 如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。
3. Callable是一个具有类型参数的泛型,它的类型参数返回的是从方法call()中返回的值。除此之外,还必须使用ExecutorService.submit()方法来调用它。
4. submit()方法会产生Future对象,它用Callable返回结果的特定类型进行了参数化。可以通过isDone()来查询Future是否已经完成。任务完成时,它有一个结果,你可以通过
调用get()方法获取该结果。当然,也可以不调用isDone()方法,直接调用get(),这种情况下,get()将阻塞,直至结果准备就绪。
1 import java.util.ArrayList; 2 import java.util.concurrent.Callable; 3 import java.util.concurrent.ExecutionException; 4 import java.util.concurrent.ExecutorService; 5 import java.util.concurrent.Executors; 6 import java.util.concurrent.Future; 7 8 9 public class TaskWithResult implements Callable<String> { 10 11 private int id; 12 13 public TaskWithResult(int id) { 14 this.id = id; 15 } 16 17 @Override 18 public String call() throws Exception { 19 return "Result of TaskWithResult: " + this.id; 20 } 21 22 public static void main(String[] args) { 23 ExecutorService exec = Executors.newCachedThreadPool(); 24 ArrayList<Future<String>> results = new ArrayList<Future<String>>(); 25 for (int i = 0; i < 5; i++) { 26 results.add(exec.submit(new TaskWithResult(i))); 27 } 28 29 for (Future<String> fs : results) { 30 try { 31 // get blocks until completion. 32 System.out.println(fs.get()); 33 } catch (InterruptedException | ExecutionException e) { 34 e.printStackTrace(); 35 } finally { 36 exec.shutdown(); 37 } 38 } 39 } 40 } 41 42 /** 43 * 程序运行结果: 44 * Result of TaskWithResult: 0 45 * Result of TaskWithResult: 1 46 * Result of TaskWithResult: 2 47 * Result of TaskWithResult: 3 48 * Result of TaskWithResult: 4 49 */