hMap什么的,java.util包中的集合类有的是线程安全的,有的则不是,在编写多线程的
程序时使用线程安全的类能省去很多麻烦,但这些类的性能如何呢?java.util.concurrent包中提供了几个并发结合类,例如ConcurrentHashMap、ConcurrentLinkedQueue和CopyOnWriteArrayList等等,根据不同的使用场景,开发者可以用它们替换java.util包中的相应集合类。 CopyOnWriteArrayList是ArrayList的一个变体,比较适合用在读取比较频繁、修改较少的情况下,因为每次修改都要复制整个底层数组。ConcurrentHashMap中为Map接口增加了一些方法(例如putIfAbsenct()),同时做了些优化,总之灰常之好用,下面的代码中使用ConcurrentHashMap来作为全局节点表,完全无需考虑并发问题。ValidationService中只是声明(第17行),具体的使用是在上面的ValidationTask中。Java代码 package service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 执行验证的服务类 * * @author DigitalSonic */ public class ValidationService { /** * 全局节点表 */ public static final Map<String, Node> NODE_MAP = new ConcurrentHashMap<String, Node>(); private ThreadPoolService threadPoolService; public ValidationService(ThreadPoolService threadPoolService) { this.threadPoolService = threadPoolService; } /** * 给出一个入口节点的WSDL,通过广度遍历的方式验证与其相关的各个节点 * * @param wsdl 入口节点WSDL */ public void validate(List<String> wsdl) { List<String> visitedNodes = new ArrayList<String>(); List<String> nextRoundNodes = new ArrayList<String>(); nextRoundNodes.addAll(wsdl); while (nextRoundNodes.size() > 0) { List<ValidationTask> tasks = getTasks(nextRoundNodes); List<Node> nodes = threadPoolService.invokeAll(tasks); visitedNodes.addAll(nextRoundNodes); nextRoundNodes.clear(); getNextRoundNodes(nodes, visitedNodes, nextRoundNodes); } } private List<String> getNextRoundNodes(List<Node> nodes, List<String> visitedNodes, List<String> nextRoundNodes) { for (Node n