Java:Callable

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  */
TaskWithResult.java

posted @ 2013-10-19 15:16  slowalker  阅读(337)  评论(0)    收藏  举报