实战Concurrent(3)

来自http://www.iteye.com/topic/363625

 

3、并发集合类

集合类是大家编程时经常要使用的东西,ArrayList、HashMap什么的,java.util包中的集合类有的是线程安全的,有的则不是,在编写多线程的程序时使用线程安全的类能省去很多麻烦,但这些类的性能如何呢?java.util.concurrent包中提供了几个并发结合类,例如ConcurrentHashMap、ConcurrentLinkedQueue和CopyOnWriteArrayList等等,根据不同的使用场景,开发者可以用它们替换java.util包中的相应集合类。

 

CopyOnWriteArrayList是ArrayList的一个变体,比较适合用在读取比较频繁、修改较少的情况下,因为每次修改都要复制整个底层数组。ConcurrentHashMap中为Map接口增加了一些方法(例如putIfAbsenct()),同时做了些优化,总之灰常之好用,下面的代码中使用ConcurrentHashMap来作为全局节点表,完全无需考虑并发问题。ValidationService中只是声明(第17行),具体的使用是在上面的ValidationTask中。

Java代码  
  1. package  service;  
  2.   
  3. import  java.util.ArrayList;  
  4. import  java.util.List;  
  5. import  java.util.Map;  
  6. import  java.util.concurrent.ConcurrentHashMap;  
  7.   
  8. /**  
  9.  * 执行验证的服务类  
  10.  *   
  11.  * @author DigitalSonic  
  12.  */   
  13. public   class  ValidationService {  
  14.     /**  
  15.      * 全局节点表  
  16.      */   
  17.     public   static   final  Map<String, Node> NODE_MAP =  new  ConcurrentHashMap<String, Node>();  
  18.   
  19.     private  ThreadPoolService threadPoolService;  
  20.       
  21.     public  ValidationService(ThreadPoolService threadPoolService) {  
  22.         this .threadPoolService = threadPoolService;  
  23.     }  
  24.   
  25.     /**  
  26.      * 给出一个入口节点的WSDL,通过广度遍历的方式验证与其相关的各个节点  
  27.      *   
  28.      * @param wsdl 入口节点WSDL  
  29.      */   
  30.     public   void  validate(List<String> wsdl) {  
  31.         List<String> visitedNodes = new  ArrayList<String>();  
  32.         List<String> nextRoundNodes = new  ArrayList<String>();  
  33.   
  34.         nextRoundNodes.addAll(wsdl);  
  35.         while  (nextRoundNodes.size() >  0 ) {  
  36.             List<ValidationTask> tasks = getTasks(nextRoundNodes);  
  37.             List<Node> nodes = threadPoolService.invokeAll(tasks);  
  38.   
  39.             visitedNodes.addAll(nextRoundNodes);  
  40.             nextRoundNodes.clear();  
  41.             getNextRoundNodes(nodes, visitedNodes, nextRoundNodes);  
  42.         }  
  43.     }  
  44.   
  45.     private  List<String> getNextRoundNodes(List<Node> nodes,  
  46.             List<String> visitedNodes, List<String> nextRoundNodes) {  
  47.         for  (Node node : nodes) {  
  48.             for  (String wsdl : node.getDependencies()) {  
  49.                 if  (!visitedNodes.contains(wsdl)) {  
  50.                     nextRoundNodes.add(wsdl);  
  51.                 }  
  52.             }  
  53.         }  
  54.         return  nextRoundNodes;  
  55.     }  
  56.   
  57.     private  List<ValidationTask> getTasks(List<String> nodes) {  
  58.         List<ValidationTask> tasks = new  ArrayList<ValidationTask>(nodes.size());  
  59.         for  (String wsdl : nodes) {  
  60.             tasks.add(new  ValidationTask(wsdl));  
  61.         }  
  62.         return  tasks;  
  63.     }  

你可能感兴趣的:(java,多线程,编程)