前言

致Nuria、Paula和Pelayo,感谢你们无限的关爱和耐心。

前言

目前,计算机系统(以及其他相关系统,如平板电脑、智能手机等)可以让你同时执行多项任务。这是因为它们拥有并发的操作系统,能够同时控制多项任务。使用你最喜欢的编程语言中的并发API,还能实现一个可以同时执行多项任务(读取文件、显示消息、读取网络上的数据)的应用程序。Java提供了一套非常强大的并发API,让你不费吹灰之力就可以实现任何类型的并发应用程序。在Java的每个版本中,该并发API提供给程序员的功能都有所增加。从Java 8开始,已经包含了流API以及一些便于实现并发应用程序的新方法和类。本书讲述了Java并发API最重要的元素,展示了如何在实际开发中使用它们。这些元素如下所示。

  • 执行器框架,用于控制大量任务的执行。
  • Phaser类,用于执行可划分为多个阶段的任务。
  • Fork/Join框架,用于执行采用分治法解决问题的任务。
  • 流API,用于处理大型数据源,包括新的反应流。
  • 并发数据结构,用于在并发应用程序中存储数据。
  • 同步机制,用于组织并发任务。

此外,Java并发API还包含更多内容,包括设计并发应用程序的方法论、设计模式、实现良好并发应用程序的提示和技巧、测试并发应用程序的工具和方法,以及采用其他面向Java虚拟机的语言 (例如Clojure、Groovy和Scala)实现并发应用程序的方法。

本书内容

第1章,“第一步:并发设计原理”。这一章将介绍并发应用程序的设计原理。你还将了解到并发应用程序可能出现的问题,以及设计并发应用程序的方法论,同时还会学到一些设计模式、提示和技巧。

第2章,“使用基本元素:ThreadRunnable。这一章将解释如何采用Java语言中最基本的元素(Runnable接口和Thread类)来实现并发应用程序。有了这些元素,你可以创建一个可与实际执行线程并行执行的新执行线程。

第3章,“管理大量线程:执行器”。这一章将介绍执行器框架的基本原理。该框架让你能够使用大量的线程,而无须创建或管理它们。你将实现k-最近邻算法和一个基本的客户端/服务器应用程序。

第4章,“充分利用执行器”。这一章将探讨执行器的一些高级特性,包括为了在一段延迟之后或每隔一定时间执行任务而进行的任务撤销和调度。你将实现一个高级客户端/服务器应用程序和一个新闻阅读器。

第5章,“从任务获取数据:Callable接口与Future接口”。这一章将介绍如何在执行器中处理采用CallableFuture接口返回结果的任务。你将实现一个最佳匹配算法以及一个构建倒排索引的应用程序。

第6章,“运行分为多阶段的任务:Phaser类”。这一章将介绍如何使用Phaser类来并发执行那些可分为多个阶段的任务。你将实现关键字抽取算法和遗传算法。

第7章,“优化分治解决方案:Fork/Join框架”。这一章将介绍如何使用一种特殊的执行器,该执行器针对可以使用分治法解决的问题进行了优化,这就是Fork/Join框架及其工作窃取(work-stealing)算法。你将实现k-means聚类算法、数据筛选算法以及归并排序算法。

第8章,“使用并行流处理大规模数据集:MapReduce模型”。这一章将介绍如何采用流来处理大规模数据集。你将学习如何使用流API和更多的流函数来实现MapReduce应用程序。你将实现一个数值汇总算法和一个信息检索工具。

第9章,“使用并行流处理大规模数据集:MapCollect模型”。这一章将探讨如何使用流API中的collect()方法对数据流执行可变约简(mutable reduction)操作,将其转换为一种不同的数据结构,包括在Collectors类中预定义的一些收集器。你将实现一个无须建立索引就能够搜索数据的工具、一个推荐系统,以及计算社交网络中两个人的共同联系人列表的算法。

第10章,“异步流处理:反应流”。这一章将解释如何使用反应流来实现并发应用程序,而反应流则为带有非阻塞回压的异步流处理定义了标准。这种流的基本原理在官方网站的Reactive Streams介绍页面上有明确说明,而Java 9为其实现提供了必要的基础接口。

第11章,“探究并发数据结构和同步工具”。这一章将介绍如何使用最重要的并发数据结构(可用于并发应用程序而不会导致数据竞争条件的数据结构),以及Java并发API中用于组织任务执行的所有同步机制。

第12章,“测试与监视并发应用程序”。这一章将介绍如何获得Java并发API元素(线程、锁、执行器等)的状态信息。你还将学习如何使用JConsole应用程序来监视并发应用程序,以及如何使用MultithreadedTC库和Java Pathfinder应用程序来测试并发应用程序。

第13章,“JVM中的并发处理:Clojure、带有Gpars库的Groovy以及Scala”。这一章将介绍如何使用面向Java虚拟机的其他编程语言来实现并发应用程序。你将学习如何使用Clojure、Scala以及带有Gpars库的Groovy等编程语言所提供的并发元素。

阅读前提

要学习本书,你需要拥有Java编程语言的初中级知识,最好还对并发概念有基本的了解。

本书读者

如果你是了解并发编程基本原理的Java开发人员,同时又想成为Java并发API的专家型用户,以便开发出能够充分利用计算机全部硬件资源的最优化应用程序,那么本书就非常适合你。

排版约定

在本书中,你会发现多种文本样式,用于区分不同种类的信息。下面是一些文本样式的例子,以及对这些样式含义的说明。

正文中的代码、数据库表名、用户输入等都采用如下样式:“modify()方法并不是原子的,而Account类也不是线程安全的。”

代码段的样式如下。

public void task2() {
  section2_1();
  commonObject2.notify();
  commonObject1.wait();
  section2_2();
}

新术语重点强调的内容都以黑体字表示。

 此图标表示警告或重要说明。

 此图标表示提示和技巧。

读者反馈

我们时刻欢迎你的反馈意见。这可以让我们了解你对本书的看法——喜欢什么或不喜欢什么。你的反馈对我们很重要,它可以帮助我们设计出真正让你受益良多的图书。请将一般性反馈意见直接发送至feedback@packtpub.com,并在邮件的主题中注明书名。如果你对于某一主题有所专长,而且也有兴趣撰写或者参与编写一本书,请访问www.packtpub.com/authors查看我们的作者指南。

客户支持

现在,你已经是尊贵的Packt图书所有者了,我们通过以下方式使你的购买物有所值。

下载示例代码

你可以登录你的账户从http://www.packtpub.com下载本书的示例代码文件。如果你从其他地方购买了本书,可以访问http://www.packtpub.com/support并进行注册,我们会通过电子邮件将相关文件直接发送给你。可以通过以下步骤来下载代码文件。

(1) 使用你的电子邮件地址和密码登录网站或注册。

(2) 将鼠标放在顶部的SUPPORT选项卡上。

(3) 点击Code Downloads & Errata选项。

(4) 在Search框中输入书名。

(5) 选择要下载代码文件的那本书。

(6) 从下拉菜单中选择购书途径。

(7) 点击Code Download按钮。

下载文件之后,请确保使用下述工具的最新版本来解压或提取文件夹。

  • WinRAR / 7-Zip(Windows)。
  • Zipeg / iZip / UnRarX(Mac)。
  • 7-Zip / PeaZip(Linux)。

GitHub网站上也提供了本书配套的代码,可通过网址https://github.com/PacktPublishing/Mastering-Concurrency-Programming-with-Java-9-Second-Edition下载。通过网址https://github.com/PacktPublishing/还可以获得我们各类图书和视频的配套代码。请检出它们供你使用吧!

勘误

尽管为确保内容的准确性,我们已经很谨慎,但是错误仍然在所难免。如果你在书中发现了任何文字或代码错误,请告知我们,我们将不胜感激。这样可以使其他读者免受同样的困惑,并能帮助我们改进本书的后续版本。如果你发现了任何错误,请访问http://www.packtpub.com/submit-errata将错误告知我们。1你需要在该页面上选定这本书,然后点击Errata Submission Form链接,输入勘误的详细内容。当勘误通过验证后,内容将被接受,而且该勘误信息将上传到我们的网站,或者添加到该书下面Errata部分的已有勘误表列表当中。要查看以前提交的勘误,可以访问https://www.packtpub.com/books/content/support,在搜索栏中输入本书的名称。相关信息将出现在Errata部分中。

1针对本书中文版的勘误,请到http://www.ituring.com.cn/book/2018查看和提交。——编者注

盗版问题

对所有媒体来说,互联网盗版都是一个长期存在的问题。在Packt公司,我们对自己的版权和许可证的保护非常严格。如果你在互联网上遇到以任何形式非法复制我们作品的行为,请立刻向我们提供具体地址或网站名称,以帮助我们采取补救措施。请通过copyright@packtpub.com联系我们,并且附上可疑盗版资料的链接。感谢你帮助我们保护作者,使我们能够带给你更有价值的内容。

其他问题

如果你对本书的任何方面还存有疑问,可以通过questions@packtpub.com邮箱联系我们,我们将尽力解决。

电子书

扫描如下二维码,即可购买本书电子版。

{%}

目录

  • 版权声明
  • 译者序
  • 前言
  • 第 1 章 第一步:并发设计原理
  • 第 2 章 使用基本元素:Thread和Runnable
  • 第 3 章 管理大量线程:执行器
  • 第 4 章 充分利用执行器
  • 第 5 章 从任务获取数据:Callable接口与Future接口
  • 第 6 章 运行分为多阶段的任务:Phaser类
  • 第 7 章 优化分治解决方案:Fork/Join框架
  • 第 8 章 使用并行流处理大规模数据集:MapReduce模型
  • 第 9 章 使用并行流处理大规模数据集:MapCollect模型
  • 第 10 章 异步流处理:反应流
  • 第 11 章 探究并发数据结构和同步工具
  • 第 12 章 测试与监视并发应用程序
  • 第 13 章 JVM中的并发处理:Clojure、带有GPars库的Groovy以及Scala