Java并发框架回顾

Java并发框架回顾

从GPars系列文章(1234567891011)我们了解到,GPars中的一些模型是对Java并发框架进行了封装(需要jsr166y070108.jar),比如Parallelizer(Gpars 0.10 中已经更名为GParsPool)就是针对ParallelArray的DSL,Fork/join隐藏了JSR-166y类库的一些不便之处等等。为了更好的理解、使用GPars,有必要对Java并发框架进行回顾。

Java并发框架java.util.concurrent是JDK5中引入到标准库中的(采用的是Doug Lea的并发库)。该包下的类可以分为这么块:

Executors

  • 接口:
    • Executor(例子涉及):用来执行提交的Runnable任务的对象。是一个简单的标准化接口,用来定义包括线程池、异步IO、轻量级任务框架等等。任务可以由一个新创建的线程、一个已有任务执行线程、或是线程直接调用execute()来执行,可以串行也可并行执行,取决于使用的是哪个Executor具体类。
    • ExecutorService(例子涉及):Executor的子接口,提供了一个更加具体的异步任务执行框架:提供了管理结束的方法,以及能够产生Future以跟踪异步任务进程的方法。一个ExcutorService管理着任务队列和任务调度。
    • ScheduledExecutorService(例子涉及):ExecutorService的子接口,增加了对延迟和定期任务执行的支持。
    • Callable(例子涉及):一个返回结果或抛出异常的任务,实现类需要实现其中一个没有参数的叫做call的方法。Callabe类似于Runnable,但是Runnable不返回结果且不能抛出checked exception。ExecutorService提供了安排Callable异步执行的方法。
    • Future(例子涉及):代表一个异步计算的结果(由于是并发执行,结果可以在一段时间后才计算完成,其名字可能也就是代表这个意思吧),提供了可判断执行是否完成以及取消执行的方法。
  • 实现:
    • ThreadPoolExecutor和ScheduledThreadPoolExecutor:可配置线程池(后者具备延迟或定期调度功能)。
    • Executors(例子涉及):提供Executor、ExecutorService、ScheduledExecutorService、ThreadFactory以及Callable的工厂方法及工具方法。
    • FutureTask:对Future的实现
    • ExecutorCompletionService(例子涉及):帮助协调若干(成组)异步任务的处理。

Queues

  • 非阻塞队列:ConcurrentLinkedQueue类提供了一个高效可伸缩线程安全非阻塞FIFO队列。
  • 阻塞队列:BlockingQueue接口,有五个实现类:LinkedBlockingQueue(例子涉及)、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue和DelayQueue。他们对应了不同的应用环境:生产者/消费者、消息发送、并发任务、以及相关并发设计。

Timing

  • TimeUnit类(例子涉及):提供了多种时间粒度(包括纳秒)用以表述和控制基于超时的操作。

Synchronizers

    提供特定用途同步语境

  • Semaphore(例子涉及):计数信号量,这是一种经典的并发工具。
  • CountDownLatch(例子涉及):简单的倒计数同步工具,可以让一个或多个线程等待直到另外一些线程中的一组操作处理完成。
  • CyclicBarrier(例子涉及):可重置的多路同步工具,可重复使用(CountDownLatch是不能重复使用的)。
  • Exchanger:允许两个线程在汇合点交换对象,在一些pipeline设计中非常有用。

Concurrent Collections

除队列外,该包还提供了一些为多线程上下文设计的集合实现:ConcurrentHashMap、CopyOnWriteArrayList及CopyOnWriteArraySet。

注意:”Concurrent”前缀的类有别于”synchronized”前缀的类。“concurrent”集合是线程安全的,不需要由单排斥锁控制的(无锁的)。以ConcurrentHashMap为例,允许任何数量的并发读及可调数量的并发写。“Synchronized”类则一般通过一个单锁来防止对集合的所有访问,开销大且伸缩性差。(关于无锁并发算法的一些讨论,可以参见本站点《Groovy++里的快速不可变持久函数式队列》、《Groovy++里的无锁消息传递算法》、《Groovy++里的agents》等相关文章)

例子

上面基本上是官方概念性的描述,要想快速掌握,还是多看些例子比较好。抓虾上面就有一篇非常不错的相关文章(JavaEye上也有人转载),里面搜集的例子都比较浅显易懂,很适合学习Java并发框架用。严重推荐!

java.util.conrurrent下还有两个子包多少也可能会用到:

java.util.concurrent.atomic包下是一组工具类,支持在单个变量上无锁线程安全编程。

java.util.concurrent.locks包提供了一个用于锁定和等待条件的框架、不同于内建同步和监视器(synchronization and monitors)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注