- 浏览: 119832 次
- 性别:
- 来自: 宁波
-
文章分类
最新评论
6.3、Coordination classes
java.util.concurrent包中有几个类适用于常见的多线程通讯。这几个协作类适用范围几乎涵盖了使用wait/notify和Condition最常见的场景,而且更安全、更易于使用。
CyclicBarrier
在CyclicBarrier初始化的时候指定参与者的数量。参与者调用awart()方法进入阻塞状态直到参与者的个数达到指定数量,此时最后一个到达的线程执行预定的屏障任务,然后释放所有的线程。屏障可以被重复的重置状态。常用于协调分组的线程的启动和停止。
CountDownLatch
需要指定一个计数才能初始化CountDownLatch。线程调用await()方法进入等待状态知道计数变为0。其他的线程(或者同一个线程)调用countDown()来减少计数。如果计数变为0后是无法被重置的。常用于当确定数目的操作完成后,触发数量不定的线程。
Semaphore
Semaphore维护一个“许可”集,能够使用acquire()方法检测这个“许可”集,在“许可”可用之前Semaphore会阻塞每个acquire访问。线程能够调用release()来返回一个许可。当Semaphore只有一个“许可”的时候,可当做一个互斥锁来使用。
Exchanger
线程在Exchanger的exchange()方法上进行交互、原子操作的方式交换数据。功能类似于数据可以双向传递的SynchronousQueue加强版。
7、任务执行
很多java并发程序需要一个线程池来执行队列中的任务。在java.util.concurrent包中为这种类型的任务管理提供了一种可靠的基本方法。
7.1、ExecutorService
Executor和易扩展的ExecutorService接口规定了用于执行任务的组件的标准。这些接口的使用者可以通过一个标准的接口使用各种具有不同行为的实现类。
最通用的Executor接口只能访问这种类型的可执行(Runnable)任务 :
void execute(Runnable command)
Executor子接口ExecutorService新加了方法,能够执行:Runnable任务、Callable任务以及任务集合。
Future<?> submit(Runnable task)
Future<T> submit(Callable<T> task)
Future<T> submit(Runnable task, T result)
List<Future<T>> invokeAll (Collection<? extends Callable<T>> tasks)
List<Future<T>> invokeAll (Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
T invokeAny(Collection<? extends Callable<T>> tasks)
T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
7.2、Callable and Future
Callable类似于Runnable,而且能够返回值、抛出异常:
l V call() throws Exception;
在一个任务执行框架中提交一个Callable 任务,然后返回一个Future结果是很常见的。Future表示在将来的某个时刻能够获取到结果。Future提供能够获取结果或者阻塞直到结果可用的方法。任务运行之前或正在运行的时候,可以通过Future中的方法取消。
如果只是需要一个Runnable特性的Future(例如在Executor执行),可用使用FutureTask。FutureTask实现了Future和Runnable接口,可用提交一个Runnable类型任务,然后在调用部分使用这个Future类型的任务。
7.3、实现ExecutorService
ExecutorService最主要的实现类是ThreadPoolExecutor。这个实现类提供了大量的可配置特性:
l 线程池--设定常用线程数量(启动前可选参数)和最大可用线程数量。
l 线程工厂--通过自定义的线程工厂生成线程,例如生成自定义线程名的线程。
l 工作队列--指定队列的实现类,实现类必须是阻塞的、可以是无界的或有界的。
l 被拒绝的任务--当队列已经满了或者是执行者不可用,需要为这些情况指定解决策略。
l 生命周期中的钩子--重写扩展在任务运行之前或之后的生命周期中的关键点
l 关闭--停止已接受的任务,等待正在运行的任务完成后,关闭ThreadPoolExecutor。
ScheduledThreadPoolExecutor是ThreadPoolExecutor的一个子类,能够按照定时的方式完成任务(而不是FIFO方式)。在java.util.Timer不是足够完善的情况下,ScheduleThreadPoolExecutor具有强大的可适用性。
Executors类有很多静态方法(表10)用于创建适用于各种常见情况的预先包装的ExecutorService和ScheduleExecutorService实例
表10
方法 |
描述 |
newSingleThreadExecutor |
创建只有一个线程的ExecutorService |
newFixedThreadPool |
返回拥有固定数量线程的ExecutorService |
newCachedThreadPool |
返回一个线程数量可变的ExecutorService |
newSingleThreadScheduledExecutor |
返回只有一个线程的ScheduledExecutorService |
newScheduledThreadPool |
创建拥有一组核心线程的ScheduledExecutorService |
下面的例子是创建一个固定线程池,然后提交一个长期运行的任务:
在这个示例中提交任务到executor之后,代码没有阻塞而是立即返回。在代码的最后一行调用get()方法会阻塞直到有结果返回。
ExecutorService几乎涵盖了所有应该创建线程对象或线程池的情景。在代码中需要直接创建一个线程的时候,可以考虑通过Executor工厂创建的ExecutorService能否实现相同的目标;这样做经常更简单、更灵活。
7.4、CompletionService
除了常见的线程池和输入队列模式,还有一种常见的情况:为后面的处理,每个任务生成的结果必须积累下来。CompletionService接口允许提交Callable和Runnable任务,而且还可以从任务队列中获取这些结果:(绿色部分和英文版不一样,已和作者确认,英文版将take()和poll()方法混淆了)
l Future<V> take () -- 如果结果存在则获取,否则直接返回
l Future<V> poll () -- 阻塞直到结果可用
l Future<V> poll (long timeout, TimeUnit unit) -- 阻塞直到timeout时间结束
ExecutorCompletionService是CompletionService的标准实现类。在ExecutorCompletionService的构成函数中需要一个Executor,ExecutorCompletionService提供输入队列和线程池。
8、Hot Tip
热门信息:当设置线程池大小的时候,最好是基于当前应用所运行的机器拥有的逻辑处理器的数量。在java中,可用使用Runtime.getRuntime().availableProcessors()获取这个值。在JVM的生命周期中,可用处理器的数目是可变的。
9、关于作者
Alex Miller是Terracotta Inc公司Java集群开源产品的技术负责人,曾在BEA System和MetaMatrix工作,是MetaMatrix的首席架构师。他对Java、并发、分布式系统、查询语言和软件设计感兴趣。他的tweeter:@puredanger,blog:http://tect.puredanger.com,很喜欢在用户组会议中发言。在St. Louis,Alex是Lambda Lounge小组的创建人,Lambda Lounge用户组是为了学习、动态语言、Strange Loop开发会议而创建的。
10、翻译后记
开始阅读英文版的时候,并没有觉得文章中有什么晦涩的地方。但是在翻译之后,才发现将文中的意思清楚地表达出来也是个脑力活,有时一句话能够懂得意思,却是很难用汉语表达出来:“只可意会,不可言传”--这也能解释我当年高中作文为啥每次只能拿40分(总分60)。在禅宗,师傅教弟子佛理,多靠弟子自身的明悟,故有当头棒喝、醍醐灌顶之说。做翻译却不能这样,总不能让读者对着满篇的鸟文去琢磨明悟吧,须得直译、意译并用,梳理文字。
翻译也是一个学习的过程。阅读本文的时候会无意忽略自己以为不重要的词句,待到真正翻译的时候,才发现自己一知半解、一窍不通,就只好Google之,翻译完成后,也学了些知识,可谓是一箭双雕。
个人精力所限,翻译中难免有不对的地方,望大家予以指正。
11、原文+译文下载地址
http://download.csdn.net/source/2805800
发表评论
-
一次Java垃圾收集调优实战
2011-01-04 21:45 1441 资料 JDK5.0垃圾收集优化之--Don't ... -
架构师必读书籍
2011-01-04 21:40 476年又过年,去年在写在译的书又长出了一茬,又是时候订一份今 ... -
工作流相关
2011-01-04 10:09 835微内核工作流引擎体系架构与部分解决方案参考 -
jsp/servlet相关
2010-12-30 20:22 1156Servlet/JSP学习笔记(1)-tomcat和eclip ... -
memcached相关
2010-12-30 20:03 875memcached完全剖析-1.memcached基础: h ... -
Hibernate 和 memcached 的集成问题
2010-12-30 19:53 1067做过的项目中Hibernate都是直接采用ehcache做为缓 ... -
hibernate-memcached--在Hibernate中使用Memcached作为一个二级分布式缓存
2010-12-30 19:49 1428hibernate-memcached--在Hiberna ... -
数据库推荐
2010-12-30 19:09 769基于mysql的数据库集群系统的实现: http://hi. ... -
hadoop推荐
2010-12-30 15:27 880CSDN hadoop专题 http://subject. ... -
java与内存文章推荐
2010-12-30 10:58 772内存详解:理解jvm如何使用windows和linux上的内存 ... -
lucene相关
2010-12-29 20:12 800深入 Lucene 索引机制 http://www.i ... -
String的理解
2010-12-29 15:49 758本文是对http://www.iteye.com/topic/ ... -
Tomcat虚拟主机及Root Context配置
2010-12-12 21:44 10181.虚拟主机 对一个Tomcat,可以配置多台虚拟主机。 ... -
转载来的过来经典java网站
2010-12-04 22:30 812一个朋友给我的希望大家喜欢,自己留个备份,没事逛逛!!http ... -
继续Open Session In View
2010-12-04 22:26 1023转自:http://www.iteye.com/top ... -
j2ee中的事务浅谈(转)
2010-12-04 21:50 733事务是企业应用开发中的重要概念,对于部分 Web 应用,事务也 ... -
Tomcat6 使用 NIO
2010-12-04 21:49 915首先,何谓nio? ... -
深入探讨 Java 类加载器2
2010-12-04 21:44 599开发自己的类加载器 我的天,爱死这作者了!!(转载 ... -
通过 Tomcat Advanced I/O 获得高性能的 Ajax
2010-12-04 21:19 743转自:http://www.ibm.com/develop ... -
Servlet 3.0 实战:异步 Servlet 与 Comet 风格应用程序
2010-12-04 21:16 803转自http://www.ibm.com/develo ...
相关推荐
Java并发核心编程.pdf
### Java 并发核心编程知识点解析 #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助...
Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...
Java并发核心编程是Java开发中的重要领域,它涉及到多线程和高效率程序设计的关键技术。在Java 5和Java 6中,JVM引入了大量的并发工具和改进,以支持多处理器和多核系统上的高性能应用程序。以下是这些知识点的详细...
在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
《基于Java高并发编程核心技术的第二卷源码设计》项目采用Java语言编写,整体包含360个文件,其中以Java源文件为主,达339个,辅以9个XML配置文件、4个Proto缓冲文件、3个可执行文件、2个Git忽略文件、1个Markdown...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
### Java并发核心编程 #### 一、关于Java并发 自Java问世以来,就一直支持并发的概念,例如线程和锁等。并发编程是现代软件工程中不可或缺的一部分,尤其是在多核处理器普及的今天,利用好并发可以极大地提升程序...
4. **线程池**:`ExecutorService`是Java并发框架的核心,它管理一组可重用线程,有效地调度和执行任务。`ThreadPoolExecutor`是其最常见的实现,允许自定义线程池参数。 5. **并发工具类**:如`CountDownLatch`、`...
Java并发API的核心组件包括: 1. **ExecutorService**: 这是线程池的接口,通过它可以管理和控制线程的执行。`Executors`类提供了一些工厂方法来创建不同类型的线程池,如固定大小的线程池、单线程的Executor等。 ...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的区别** - **线程** 是程序执行的最小单位,一个进程中可以有多个线程同时执行,共享同一块内存空间,通信...
2. **同步机制**:Java并发编程的核心在于同步,以防止数据不一致性和资源竞争。`synchronized`关键字用于实现临界区的互斥访问,确保同一时刻只有一个线程执行特定代码块。此外,还有`wait()`, `notify()`, `...
这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者理解并掌握Java并发编程的核心概念和技术。 在Java并发编程中,首先我们需要了解的基本概念是线程。线程是操作系统分配CPU时间的...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,尤其是在Java这种支持多线程的语言中。Java并发API包括了线程、锁、同步、...