![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 92
西木NT
人生需要架构
展开
-
监控执行器框架
Java 9并发编程指南 目录监控执行器框架准备工作实现过程工作原理更多关注Executor框架将任务实现与线程创建和执行任务的管理分离开来。 如果使用执行器,只需要实现Runnable对象,然后发送到执行器即可。管理线程是执行器的责任,当向执行器发送任务时,它尝试使用池线程来执行任务,以避免创建新线程。这种机制由Executor接口及其实现类作为ThreadPoolExecutor类提供。...翻译 2018-12-01 07:59:36 · 339 阅读 · 0 评论 -
集合流元素
Java 9并发编程指南 目录集合流元素准备工作实现过程工作原理扩展学习更多关注Java流使用连续或者并行方式来处理序列元素。能够通过不同的数据来源创建流,例如Collection,File或者Array,以及通常用lambda表达式定义的操作序列作用在这些元素上。这些操作被拆分成两种不同的类:**中间操作:**这些操作通常伴随结果生成新的流,用来对流元素进行转换、筛选和排序**终点操作...翻译 2018-11-28 07:39:43 · 181 阅读 · 0 评论 -
应用操作到流的每个元素
Java 9并发编程指南 目录应用操作到流的每个元素准备工作实现过程工作原理扩展学习更多关注本节中,学习如何应用操作到留的所有元素上。我们将使用三个方法:两个终点操作,forEach()和forEachOrdered()方法,以及一个中间操作peek()方法。准备工作本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。实现过程在...翻译 2018-11-28 07:39:51 · 139 阅读 · 0 评论 -
筛选流元素
Java 9并发编程指南 目录筛选流元素准备工作实现过程工作原理扩展学习更多关注应用在流上最重要的一个应用是筛选操作,用来选择需要处理的元素。本节将学习使用Stream类提供的不同方法选择流元素。准备工作本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。实现过程在本节中,将实现之前描述的如何通过输入源创建流的范例。通过如下步骤...翻译 2018-11-28 07:39:59 · 199 阅读 · 0 评论 -
变换流元素
Java 9并发编程指南 目录变换流元素准备工作实现过程工作原理扩展学习更多关注作用在流上最重要的一些中间操作是对流元素进行转换。这些操作接收一个类的元素并且返回不同类的元素,甚至能够改变流的类型,从Stream生成IntStream、LongStream或者DoubleStream。本节中,学习如何使用Stream类的转换中间操作将元素变成其它类的元素。准备工作本范例通过Eclipse...翻译 2018-12-01 08:00:32 · 300 阅读 · 0 评论 -
排序流元素
Java 9并发编程指南 目录排序流元素准备工作实现过程工作原理扩展学习更多关注排序流元素是Stream的典型操作。例如,需要按照名称、邮编,或者其它任何数字值对Stream元素进行排序。对于流,我们还需要考虑所谓的出现顺序。 一些流可能有一个定义好的出现顺序(这取决于Stream的来源)。有些操作使用出现顺序中的流元素,例如limit()、skip()和其他操作,使得这些方法的并行计算性能...翻译 2018-12-02 08:05:39 · 163 阅读 · 0 评论 -
流元素中验证条件
Java 9并发编程指南 目录流元素中验证条件准备工作实现过程工作原理扩展学习更多关注Stream类提供了一个有趣的功能,检查流的元素是否验证条件,此功能由返回布尔值的终点操作提供。本节中,学习Stream类中哪些方法在流元素中验证条件,以及如何使用它们。准备工作本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。实现过程在本...翻译 2018-12-02 08:05:48 · 150 阅读 · 0 评论 -
响应式流编程
Java 9并发编程指南 目录响应式流编程准备工作实现过程工作原理扩展学习响应式流(http://www.reactive-streams.org/)提供了具有非阻塞压力的异步流处理机制。响应式流基于以下三个要素:信息发布者多个信息订阅者发布者与消费者之间的订阅响应式流规范确定这些类应当如何交互,依据如下规则:发布者添加希望被通知的订阅者当订阅者添加到发布者处时接收到通知...翻译 2018-12-02 08:05:56 · 302 阅读 · 0 评论 -
使用非阻塞线程安全双端队列
Java 9并发编程指南 目录使用非阻塞线程安全双端队列准备工作实现过程工作原理扩展学习List被称为最基本的集合,具有不确定数量的元素,可以在任何位置增加、读取,或者删除元素。并发列表允许不同线程在同一时间添加或删除来自列表中的元素,而不会产生任何数据非一致性错误。与列表相似的,还有双端队列,其数据结构与队列相近,但在双端队列中,可以在前(头)后(尾)端添加或删除。本节将学习在并发应用中如...翻译 2018-11-29 07:36:26 · 463 阅读 · 0 评论 -
使用阻塞线程安全双端队列
Java 9并发编程指南 目录使用阻塞线程安全双端队列准备工作实现过程工作原理扩展学习更多关注List作为最基本的集合,包含没有限制数量的元素,可以在任何位置增加、读取,或者删除元素。并发列表允许不同线程在同一时间添加或删除来自列表中的元素,而不会产生任何数据非一致性错误。与列表相似的,还有双端队列,其数据结构与队列相近,但在双端队列中,可以在前(头)后(尾)端添加或删除。本节将学习在并发应...翻译 2018-11-29 07:36:45 · 236 阅读 · 0 评论 -
使用按优先级排序的阻塞线程安全队列
Java 9并发编程指南 目录使用按优先级排序的阻塞线程安全队列准备工作实现过程工作原理扩展学习更多关注当处理数据结构时,通常需要一个有序队列。,Java提供了具有此功能的PriorityBlockingQueue 。要添加到PriorityBlockingQueue的所有元素都必须实现Comparable接口,或者在队列的构造函数中包含Comparator。 此接口具有一个名为compar...翻译 2018-11-29 07:36:54 · 495 阅读 · 0 评论 -
归约流元素
Java 9并发编程指南 目录归约流元素实现过程工作原理扩展学习更多关注MapReduce是一种编程模型,用于在分布式环境中使用大量在集群中工作的机器来处理非常大的数据集。 这种编程模型有如下两种操作:**Map:**此操作将原始元素筛选和转换成更适合归约操作的形式**Reduce:**此操作生成来自所有元素的汇总结果,例如数字值的和或平均值。这种编程模型已经在函数式编程世界中得到广...翻译 2018-11-28 07:39:34 · 108 阅读 · 0 评论 -
创建不同来源的流
Java 9并发编程指南 目录创建不同来源的流准备工作实现过程工作原理扩展学习更多关注本节中,学习如何从不同的输入源中创建流。如下所示不同的可选方式:Collection接口的parallelStream()方法Supplier接口预先定义的元素集FIle和文件夹一个数组随机数生成器两个不同的流结合也可以从其它输入源创建Stream对象(将在“扩展学习”中描述),只是建议前...翻译 2018-11-28 07:39:26 · 86 阅读 · 0 评论 -
监控fork/join池
Java 9并发编程指南 目录监控fork/join池准备工作实现过程工作原理更多关注Executor框架将任务实现与线程创建和执行任务的管理分离开来。Java提供的fork/join框架扩展了执行器框架,用于解决特定类型的问题,以提高其它解决方案(直接使用Thread对象或者执行器框架)的性能。fork/join框架旨在解决使用fork()和join()操作能够分解为更小任务的问题。实现此...翻译 2018-12-01 07:59:45 · 397 阅读 · 0 评论 -
监控流
Java 9并发编程指南 目录监控流准备工作实现过程工作原理更多关注Java中的流是在使用lambda表达式的声明性操作管道中并行或顺序地处理(映射、筛选、转换、故约和集合)元素序列。Java 8中引入流机制,使用lambda表达式从功能上改变处理大量数据的方式,来代替传统的命令式方式。Stream接口不像其它并发类提供许多方法来监视其状态,只有peek()方法用来输出正在处理的元素日志消息...翻译 2018-12-01 07:59:53 · 239 阅读 · 0 评论 -
输出有效日志消息
Java 9并发编程指南 目录输出有效日志消息准备工作实现过程工作原理扩展学习更多关注日志系统是一种将信息写到一个或多个目的地机制,日志记录器组成部分如下:**一个或多个处理器:**处理器确定日志消息的目标和格式,可以在控制台、文件或数据库中输出日志消息。**名称:**通常类中使用的日志记录器的名称基于类名和其包的名。**级别:**日志消息具有不同的级别,表明其重要性。日志记录器也有级...翻译 2018-12-01 08:00:02 · 394 阅读 · 0 评论 -
使用FindBugs分析并发代码
Java 9并发编程指南 目录使用FindBugs分析并发代码准备工作实现过程工作原理扩展学习更多关注静态代码分析工具是分析应用程序的源代码,同时查找潜在的错误的一组工具。这些工具如Checkstyle、PMD或FindBugs,具有一组预定义的良好实践规则,并解析源代码,查找违反这些规则的地方。使用这些工具的目的是在正式上线执行之前的早期阶段,发现错误或者导致性能底下的位置。编程语言通常提供...翻译 2018-12-01 08:00:10 · 320 阅读 · 0 评论 -
配置Eclipse调试并发代码
Java 9并发编程指南 目录配置Eclipse调试并发代码准备工作实现过程工作原理如今几乎所用程序员,不管使用什么编程语言,都会使用开发环境来创建应用。它们提供了许多集成在同一应用中的有趣功能,例如:项目管理代码自动生成文档自动生成版本控系统集成测试应用的调试器创建应用的项目与元素的不同向导开发环境最有用的特性之一是调试器。使用它可以一步一步地执行应用,并分析程序的所有对象...翻译 2018-12-02 08:06:21 · 292 阅读 · 0 评论 -
使用MultithreadedTC测试并发代码
Java 9并发编程指南 目录使用MultithreadedTC测试并发代码准备工作实现过程工作原理扩展学习更多关注MultithreadedTC是用来测试并发应用的Java类库,主要是用来解决并发应用中不确定性的问题。 因为无法控制组成应用的不同线程的执行顺序,所以它内置节拍器。这些测试线程是作为类方法实现的。准备工作从https://code.google.com/archive/p/...翻译 2018-12-02 08:06:29 · 323 阅读 · 0 评论 -
使用JConsole监控
Java 9并发编程指南 目录使用JConsole监控准备工作实现过程工作原理扩展学习更多关注JConsole是遵循JMX规范的监视工具,用来获取关于应用执行的信息,如线程数、内存使用或类加载。它包含在JDK中,可以用于监视本地或远程应用程序。本节讲学习如何使用JConsole监控简单的并发应用。准备工作本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创...翻译 2018-12-02 08:06:36 · 261 阅读 · 0 评论 -
异步运行任务
Java 9并发编程指南 目录异步运行任务实现过程工作原理扩展学习更多关注在ForkJoinPool中可以使用同步或者异步的方式来执行ForkJoinTask。当使用同步方式时,发送任务到线程池中的方法直到此任务发送结束执行时才返回。当使用异步方式时,发送任务到执行器的方法立即返回,所以任务能够继续执行。你应该意识到这两种方法之间的巨大差异。 当使用同步方法时,调用这些方法之一(例如invo...翻译 2018-11-28 07:38:54 · 261 阅读 · 0 评论 -
任务中抛出异常
Java 9并发编程指南 目录任务中抛出异常准备工作实现过程工作原理扩展学习更多关注Java中有两种异常:**受检异常:**这些异常必须指定在方法的throws子句中或者内部抓取。例如,IOException或者ClassNotFoundException。**非受检异常:**这些异常不需要被指定或抓取,例如NumberFormatException。在ForkJoinTask类的c...翻译 2018-11-28 07:39:04 · 382 阅读 · 0 评论 -
取消任务
Java 9并发编程指南 目录取消任务准备工作实现过程工作原理更多关注当在ForkJoinPool类中执行ForkJoinTask对象时,使用ForkJoinTask类提供的的cancel()方法,在对象开始执行之前取消。当取消任务时,需要关注如下两点:ForkJoinPool类不提供任何方法来取消在线程池中运行或等待的所有任务。当取消一个任务时,不能取消这个任务已经执行的任务。本节...翻译 2018-11-28 07:39:14 · 357 阅读 · 0 评论 -
使用具有延迟元素的线程安全列表
Java 9并发编程指南 目录使用具有延迟元素的线程安全列表准备工作实现过程工作原理扩展学习更多关注Java API提供了一种在DelayQueue类中实现的可以用在并发应用中的数据结构。在此类中,使用激活日期存储元素,返回或从队列中提取元素的方法将忽略这些元素,这些元素数据将在后续出现 ,它们对这些方法不可见。为了获得这种行为,存储在DelayQueue类中的元素需要实现Delayed接口。...翻译 2018-11-29 07:37:03 · 160 阅读 · 0 评论 -
使用线程安全的可操纵映射
Java 9并发编程指南 目录使用线程安全的可操纵映射准备工作实现过程工作原理扩展学习更多关注ConcurrentNavigableMap是声明了Java API提供的数据结构接口,可以在并发程序中使用它。 实现ConcurrentNavigableMap接口的类将元素存储在两个部分中:唯一标识元素的键声明元素的其它数据,称为值Java API也提供了实现ConcurrentSkip...翻译 2018-11-29 07:37:13 · 502 阅读 · 0 评论 -
使用线程安全的哈希映射
Java 9并发编程指南 目录使用线程安全的哈希映射准备工作实现过程工作原理扩展学习更多关注哈希表是将键映射到值的数据结构,通常在内部使用数组存储元素和使用键计算元素在数组中位置的哈希函数。这种数据结构的主要优点是插入、删除和检索操作速度非常快,所以在执行大量检索时非常有用。Java API通过Map和ConcurrentMap接口提供了不同的哈希表实现。ConcurrentMap接口为所有...翻译 2018-11-29 07:37:24 · 263 阅读 · 0 评论 -
使用原子变量代替同步
Java 9并发编程指南 目录使用原子变量代替同步准备工作实现过程扩展学习更多关注当在多个线程之间共享数据时,必须使用同步机制保护对数据块的访问。可以在修改数据的方法声明中使用synchronized关键字,这样每次只能有一个线程修改数据。另一种方式是使用Lock类创建具有修改数据指令的临界区。自从版本5开始,Java引入原子变量。当线程使用原子变量执行操作时,类的实现检查操作是否在一个步骤...翻译 2018-12-03 09:34:02 · 250 阅读 · 0 评论 -
保持锁的时间尽可能短
Java 9并发编程指南 目录保持锁的时间尽可能短准备工作实现过程工作原理锁与其它同步机制一样,定义了一次只能执行一个线程的临界区。必须非常谨慎的定义临界区,它必须只包含真正需要互斥的指令。尤其是其包含长操作,如果临界区包含不使用共享资源的冗长操作,则性能将更差。本节将实现分别在临界区内和临界区外执行长操作任务的范例,查看这两种情况下的性能差异。准备工作本范例通过Eclipse开发工具实...翻译 2018-12-03 09:41:32 · 261 阅读 · 1 评论 -
将线程管理委托给执行器
Java 9并发编程指南 目录将线程管理委托给执行器准备工作实现过程工作原理更多关注在Java 5之前,在使用Java并发API实现并发应用时,需要自己管理线程。首先实现Runnable接口或者继承Thread类,然后创建thread对象并使用其start()方法开始执行。我们还需要控制线程状态,来了解线程是否已经结束执行或者依然在运行。Java版本5中,出现了作为执行线程池提供者的执行器概...翻译 2018-12-04 00:06:51 · 96 阅读 · 0 评论 -
使用并发数据结构
Java 9并发编程指南 目录使用并发数据结构扩展学习更多关注数据结构是程序的重要组成部分,我们总是需要管理存储在数据结构中的数据。数组、列表或者树是通用数据结构范例。Java API提供了大量随时可用的数据结构。但当处理并发应用时,由于Java API提供的所有结构并不都是线程安全的,所以需要非常谨慎使用。如果选择的数据结构不是线程安全的,那么应用中的数据可能不一致。在并发应用中使用数据结...翻译 2018-12-04 00:07:01 · 219 阅读 · 0 评论 -
使用延迟初始化进行预防
Java 9并发编程指南 目录使用延迟初始化进行预防准备工作实现过程工作原理延迟初始化是一种常见的编程技术,直到第一次使用对象时才创建。通常会在操作实现中初始化对象,而不是在类构造函数中初始化。这种技术的主要优点是节省内存,因为只创建执行应用所需的必要对象。在一个类中肯能要声明大量对象,但每次程序执行中不会用到所有对象,所以不需要为程序执行中未使用的对象提供内存。这种优势在资源有限的环境中非常...翻译 2018-12-04 00:07:11 · 130 阅读 · 0 评论 -
使用fork/join框架代替执行器
Java 9并发编程指南 目录使用fork/join框架代替执行器准备工作实现过程工作原理扩展学习使用执行器无需创建和管理线程,只要通过实现Runnable或Callable接口创建任务,并将任务发送给执行器,其线程池会分配一个线程来执行任务。Java 7引入fork/join框架的执行器,此框架在ForkJoinPool类中实现,使用分治技术将问题分割成更小的部分。当为fork/join框...翻译 2018-12-04 00:07:24 · 184 阅读 · 0 评论 -
避免在锁中使用阻塞操作
Java 9并发编程指南 目录避免在锁中使用阻塞操作准备工作实现过程工作原理更多关注阻塞操作是在事件发生之前,阻止当前线程执行。典型的阻塞操作是那些涉及控制台、文件或网络的输入或输出操作。如果在锁临界区内部使用阻塞操作,则会使应用性能恶化。当一个线程等待将结束阻塞操作的事件时,应用的其它部分可能也在等待相同的事件。然而其余线程无法访问临界区且执行其代码(临界区的代码)。本节将实现这种情况的...翻译 2018-12-04 00:07:34 · 868 阅读 · 1 评论 -
避免使用废弃方法
Java 9并发编程指南 目录避免使用废弃方法Java并发API也有废弃方法,它们是API早期版本提供但现在不应该使用的方法。废弃方法已经被更好的方式实现的方法所取代。关键的废弃操作是Thread类提供的操作,如下所示:destroy():之前此方法销毁线程,实际上它抛出NoSuchMethodError异常。suspend():此方法在线程恢复之前,暂停线程执行。stop():此方...翻译 2018-12-04 00:07:42 · 264 阅读 · 0 评论 -
使用执行器代替线程组
Java 9并发编程指南 目录使用执行器代替线程组扩展学习ThreadGroup类为分层结构中的线程提供了一种分组机制,对属于线程组的所有线程进行操作,只需调用一次即可。默认情况下,所有线程属于相同组,但在创建线程时可以指定不同的线程组。不管怎样,线程组没有提供任何有用的特性:需要创建线程且管理线程的状态控制线程组中所有线程状态的方法已经被废弃,不鼓励使用这些方法如果需要在公共结构...翻译 2018-12-04 00:07:49 · 119 阅读 · 0 评论 -
使用流处理大数据集
Java 9并发编程指南 目录使用流处理大数据集准备工作实现过程工作原理更多关注Stream接口是可以进行筛选和转换的元素序列,以顺序或并行的方式得到最终结果。此结果可以是原始数据类型(整型、长整型…),对象或者数据结构。如下特性更好的定义了Stream:流是数据序列,不是数据结构。可以将不同的源创建成流,例如集合(列表、数组…)、文件、字符串或提供流元素的类。无法访问单独的流元素。...翻译 2018-12-04 00:07:58 · 193 阅读 · 0 评论 -
通过排序避免死锁
Java 9并发编程指南 目录通过排序避免死锁实现过程工作原理扩展学习更多关注当需要在应用方法中获取多个锁时,必须非常小心控制锁的顺序,错误的选择会导致死锁情形。本节将实现死锁情形的范例,然后学习如何解决死锁。实现过程通过如下步骤实现本范例:创建名为BadLocks的类,包含两个方法,名为operation1()和operation2():public class BadLock...翻译 2018-12-03 09:32:35 · 1359 阅读 · 1 评论 -
尽可能使用不可变对象
Java 9并发编程指南 目录尽可能使用不可变对象准备工作实现过程工作原理扩展学习更多关注在Java中使用面向对象编程开发应用时,需要创建由属性和方法组成的类。类方法决定对类执行的操作,属性存储定义对象的数据。通常,每个类都实现一些方法来建立属性值。当应用运行时对象也改变,并且使用这些方法改变它们的属性值。当开发并发应用时,需要特别注意多个线程共享的对象,我们必须要使用同步机制来保护访问这种...翻译 2018-12-03 09:31:16 · 132 阅读 · 0 评论 -
使用原子变量
Java 9并发编程指南 目录使用原子变量准备工作实现过程工作原理扩展学习更多关注原子变量在Java版本5中引入,用于对单个变量进行原子操作。当使用普通变量时,Java实现的每个操作均被转换为Java字节代码指令,当编译程序时JVM能够理解这些指令。例如,当给变量分配值时,Java中只使用一个指令,但是当编译程序时,JVM语言汇总会转换成不同的指令。当使用共享变量的多个线程时,会导致数据不一致...翻译 2018-11-29 07:37:33 · 512 阅读 · 0 评论 -
使用原子数组
Java 9并发编程指南 目录使用原子数组准备工作实现过程工作原理扩展学习更多关注考虑到需要实现一个并发应用程序,具有一个或多个由多个线程共享的对象。在这种情况下,需要使用同步机制(如锁或synchronized关键字)保护对其属性的访问,以避免数据不一致错误。这些机制有如下问题:死锁:这种情况发生在一个线程被阻塞,等待被其它线程一直锁定的锁,导致阻塞程序,因此永远不会运行结束。如果只...翻译 2018-11-29 07:37:45 · 328 阅读 · 0 评论