并发工具类概述

并发工具类概述

简介

Java 2 平台包含一个新的 并发工具程序包. 这些类被设计作为构建并发类或应用程序的构建块。正如集合框架通过提供常用的数据结构的实现来极大地简化了内存中的数据组织和操纵, 并发工具程序包旨在通过提供在并发设计中通用的构建模块的实现来简化并发类的开发. 并发工具程序包包括一个高性能的,灵活的线程池;一个执行异步任务的框架;一系列为并发访问而优化的集合类; 原子变量;锁和条件变量。

使用并发实用程序, 而不是例如自身线程池的开发组件, 提供了如下优点:

    减少编程工作.使用标准的类,而不是自己开发的类,因此容易得多。
    提高了性能. 并发实用程序中的实现由并发和性能专家开发和评议; 这些实现可能会比一个典型的实现执行速度更快,更具可扩展性,即使是一个熟练的开发人员.
    提高可靠性. 开发的并发类是困难的--由Java语言提供的低级别的并发原语 (synchronized, volatile, wait(), notify(), 和 notifyAll()) 很难被正确使用, 并且错误使用这些工具很难检测和调试.通过使用标准化的,广泛的测试的并发构建模块, 许多潜在的危险被消除,如死锁的线程,消除饥饿,竞争条件,或过多的上下文切换.并发工具类都经过精心的死锁,饥饿和竞争条件审核.
    提升可维护性. 程序使用标准库中的类比那些依靠复杂的,自产自销类更容易理解和维护.
    提高了生产效率. 开发人员很可能已经理解了标准库的类, 所以也没有必要学习特殊的并发组件的API和行为. 此外,当并发应用程序是建立在可靠的并且行之有效的组件之上时,将变得非常易于调试.

总之,使用Concurrency Utilities来实现并发应用程序,可以帮助你将你的代码更清晰,更简洁,速度更快,更可靠,更具扩展性,更易于编写,更易于阅读和更易于维护.

并发实用程序包括:

    任务调度框架 - Executor 框架是一个根据一系列执行策略而规范异步任务的调用,调度,执行和管控的框架。实现提供在提交的线程中允许多任务执行, 在 单个后台线程 中(如Swing中的事件), 在一个新创建的线程中, 或在一个 线程池中, 并且开发者可以创建支持的任意执行政策的Executor框架的自定义实现. 这些内置实现提供提供可配置的策略,例如队列长度限制和可以提高应用程序的稳定性,防止失控的资源消耗的 饱和策略.
    并发集合 - 几个新的集合类被添加, 包含新的 队列, BlockingQueue and BlockingDeque 接口, 以及高性能的, Map, List, 和 Queue的并发实现类. 有关详细信息,请参阅 集合框架指南.
    原子变量 - 以原子操作单个变量(基本类型或引用)的类, 提供了高性能的原子运算和compare-and-set方法. 在 java.util.concurrent.atomic的原子变量实现提供了比可通过使用同步(在大多数平台上)的实现更高的性能, 使它们可实现高性能并行算法以及便利地实现计数器和序列号生成器.
    同步器 - 通用同步类, 包括 信号量, 互斥, 阻隔, 锁存器, 和 交互, 有利于线程之间的协调.
    锁 - 在锁通过同步的关键字内置在Java语言中期间, 也有一些对内置监视器锁的不便利的限制. java.util.concurrent.locks 包提供了一个相同的内存语义同步的高性能锁实现, 但也支持在尝试获取一个锁的同时制定超定时,每个锁多个条件变量,非嵌套("hand-over-hand")持有多个锁,并且支持中断正在等待获取锁的线程。
    纳秒粒度的时间 - System.nanoTime 方法可以访问到一个为相对时间测量的纳米粒度时间源, 并且方法可以采取以纳秒为单位的超时值,这个方法可以接受超时 (例如 BlockingQueue.offer, BlockingQueue.poll, Lock.tryLock, Condition.await, 和 Thread.sleep).System.nanoTime 的实际精度是依赖于平台的.

本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作. 
    使用BlockingQueue的关键技术点如下: 
    1.BlockingQueue定义的常用方法如下: 
        1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常 
        2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
        3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续. 
        4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null 
        5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止 
    2.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 
        1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的. 
        2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的 
        3)PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序. 
        4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的. 
    3.LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue.      


参考
http://www.cnblogs.com/liuling/p/2013-8-20-01.html

猜你喜欢

转载自wangqiaowqo.iteye.com/blog/1764835