并发:Callabel 接口

Callable 接口是一个具有类型参数的泛型,它的 call() 方法返回一个泛型,并且可以抛出异常。必须使用 ExecutorService#submit() 方法调用它。

 1 public class TaskWithResult implements Callable<String> {
 2 
 3     private int id;
 4 
 5     public TaskWithResult(int id) {
 6         this.id=id;
 7     }
 8 
 9     @Override
10     public String call() throws Exception {
11         // TODO Auto-generated method stub
12         return "result of TaskWithResult:" + id;
13     }
14 
15 }

 

 1 public class CallableDemo {
 2     public static void main(String[] args) {
 3         // TODO Auto-generated method stub
 4         ExecutorService exec = Executors.newCachedThreadPool();
 5         ArrayList<Future<String>> results = new ArrayList<Future<String>>();
 6         for (int i = 0; i < 10; i++)
 7             results.add(exec.submit(new TaskWithResult(i)));
 8         for (Future<String> fs : results)
 9             try {
10                 System.out.println(fs.get());
11             } catch (InterruptedException e) {
12                 // TODO Auto-generated catch block
13                 e.printStackTrace();
14             } catch (ExecutionException e) {
15                 // TODO Auto-generated catch block
16                 e.printStackTrace();
17             }finally{
18                 exec.shutdown();
19             }
20     }
21 }

 

submit() 方法会返回一个 Future 对象,Future 对象把 Callable#call() 的返回值按特定进行进行参数化,调用 Future#get() 可以得到 call() 的返回结果。用 Future#isDone() 判断线程是否执行结束 ,如果直接调用 Future#get() ,get() 将会阻塞,直到结果准备就绪。

 

执行结果:

result of TaskWithResult:0
result of TaskWithResult:1
result of TaskWithResult:2
result of TaskWithResult:3
result of TaskWithResult:4
result of TaskWithResult:5
result of TaskWithResult:6
result of TaskWithResult:7
result of TaskWithResult:8
result of TaskWithResult:9

posted @ 2015-08-08 15:13  pepelu  阅读(428)  评论(0编辑  收藏  举报