Java之CompletionService

来源:互联网 发布:淘宝上最帅的男模特 编辑:程序博客网 时间:2024/06/06 12:58

Java之CompletionService

标签: Java
 905人阅读 评论(0) 收藏 举报
 分类:

目录(?)[+]

说明

    将(生产新的异步任务)与(使用已完成任务的结果)分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。

通常,CompletionService 依赖于一个单独的 Executor 来实际执行任务,在这种情况下,CompletionService 只管理一个内部完成队列。ExecutorCompletionService 类提供了此方法的一个实现。

内存一致性效果:线程中向 CompletionService 提交任务之前的操作 happen-before 该任务执行的操作,后者依次 happen-before 紧跟在从对应 take() 成功返回的操作。

示例

[java] view plain copy
  1. // 这个东西的使用上很类似于CallableFutureTest,不同的是,它会首先取完成任务的线程。  
  2. public class CompletionServiceTest {  
  3.     public static void main(String[] args) throws InterruptedException, ExecutionException {  
  4.         ExecutorService exec = Executors.newFixedThreadPool(10);    
  5.         // 创建CompletionService  
  6.         CompletionService<String> serv = new ExecutorCompletionService<String>(exec);  
  7.         for (int index = 0; index < 5; index++) {    
  8.             final int NO = index;    
  9.             // Callable 接口类似于 Runnable  
  10.             Callable<String> downImg = new Callable<String>() {    
  11.                 public String call() throws Exception {    
  12.                     Thread.sleep((long) (Math.random() * 1000));    
  13.                     return "Downloaded Image " + NO;    
  14.                 }    
  15.             };  
  16.             // 提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。在完成时,可能会提取或轮询此任务。  
  17.             serv.submit(downImg);    
  18.         }  
  19.         System.out.println("Show web content");  
  20.         for (int index = 0; index < 5; index++) {  
  21.             // 获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。  
  22.             Future<String> task = serv.take();  
  23.             // 如有必要,等待计算完成,然后获取其结果。  
  24.             String img = task.get();  
  25.             System.out.println(img);  
  26.         }  
  27.         System.out.println("End");  
  28.         // 关闭线程池   
  29.         exec.shutdown();    
  30.     }    
  31. }  

输出结果:

Show web content
Downloaded Image 2
Downloaded Image 4
Downloaded Image 1
Downloaded Image 3
Downloaded Image 0
End

0 0