第四章 线程执行者(一)引言

在这个章节中,我们将覆盖:

引言

通常,当你在Java中开发一个简单的并发编程应用程序,你会创建一些Runnable对象并创建相应的Thread对象来运行它们。如果你开发一个运行多个并发任务的程序,这种途径的缺点如下:

  • 你必须要实现很多相关代码来管理Thread对象(创建,结束,获得的结果)。
  • 你必须给每个任务创建一个Thread对象。如果你执行一个大数据量的任务,那么这可能影响应用程序的吞吐量。
  • 你必须有效地控制和管理计算机资源。如果你创建太多线程,会使系统饱和。

为了解决以上问题,从Java5开始JDK并发API提供一种机制。这个机制被称为Executor framework,接口核心是Executor,Executor的子接口是ExecutorService,而ThreadPoolExecutor类则实现了这两个接口。
这个机制将任务的创建与执行分离。使用执行者,你只要实现Runnable对象并将它们提交给执行者。执行者负责执行,实例化和运行这些线程。除了这些,它还可以使用线程池提高了性能。当你提交一个任务给这个执行者,它试图使用线程池中的线程来执行任务,从而避免继续创建线程。

Callable接口是Executor framework的另一个重要优点。它跟Runnable接口很相似,但它提供了两种改进,如下:

  • 这个接口中主要的方法叫call(),可以返回结果。
  • 当你提交Callable对象到执行者,你可以获取一个实现Future接口的对象,你可以用这个对象来控制Callable对象的状态和结果。

在这章中提供了11个指南,展示了如何通过使用前面提及的类和Java并发API来处理Executor framework。 

时间: 2025-01-26 20:37:30

第四章 线程执行者(一)引言的相关文章

《Java 7并发编程实战手册》第四章线程执行器

感谢人民邮电大学授权并发网发布此书样章,新书购买传送门=>当当网 本章将介绍下列内容: 创建线程执行器 创建固定大小的线程执行器 在执行器中执行任务并返回结果 运行多个任务并处理第一个结果 运行多个任务并处理所有结果 在执行器中延时执行任务 在执行器中周期性执行任务 在执行器中取消任务 在执行器中控制任务的完成 在执行器中分离任务的启动与结果的处理 处理在执行器中被拒绝的任务 4.1 简介 通常,使用Java来开发一个简单的并发应用程序时,会创建一些 Runnable 对象,然后创建对应的 Th

线程执行者(四)执行者执行返回结果的任务

执行者执行返回结果的任务 Executor framework的一个优点是你可以并发执行返回结果的任务.Java并发API使用以下两种接口来实现: Callable:此接口有一个call()方法.在这个方法中,你必须实现任务的(处理)逻辑.Callable接口是一个参数化的接口.意味着你必须表明call()方法返回的数据类型. Future:此接口有一些方法来保证Callable对象结果的获取和管理它的状态. 在这个指南中,你将学习如何实现返回结果的任务,并在执行者中运行它们. 准备工作- 这个

线程执行者(九)执行者取消一个任务

执行者取消一个任务 当你使用执行者工作时,你不得不管理线程.你只实现Runnable或 Callable任务和把它们提交给执行者.执行者负责创建线程,在线程池中管理它们,当它们不需要时,结束它们.有时候,你想要取消已经提交给执行者 的任务.在这种情况下,你可以使用Future的cancel()方法,它允许你做取消操作.在这个指南中,你将学习如何使用这个方法来取消已经提交给执行者的任务. 准备工作- 这个指南的例子使用Eclipse IDE实现.如果你使用Eclipse或其他IDE,如NetBea

线程执行者(三)创建一个大小固定的线程执行者

创建一个大小固定的线程执行者 当你使用由Executors类的 newCachedThreadPool()方法创建的基本ThreadPoolExecutor,你会有执行者运行在某一时刻的线程数的问题.这个执行者为每个接收到的任务创建一个线程(如果池中没有空闲的线程),所以,如果你提交大量的任务,并且它们有很长的(执行)时间,你会使系统过载和引发应用程序性能不佳的问题. 如果你想要避免这个问题,Executors类提供一个方法来创建大小固定的线程执行者.这个执行者有最大线程数. 如果你提交超过这个

线程执行者(二)创建一个线程执行者

创建一个线程执行者 使用Executor framework的第一步就是创建一个ThreadPoolExecutor类的对象.你可以使用这个类提供的4个构造器或Executors工厂类来 创建ThreadPoolExecutor.一旦有执行者,你就可以提交Runnable或Callable对象给执行者来执行. 在这个指南中,你将会学习如何使用这两种操作来实现一个web服务器的示例,这个web服务器用来处理各种客户端请求. 准备工作 你应该事先阅读第1章中创建和运行线程的指南,了解Java中线程创

线程执行者(十一)执行者分离任务的启动和结果的处理

执行者分离任务的启动和结果的处理 通常,当你使用执行者执行并发任务时,你将会提交 Runnable或Callable任务给这个执行者,并获取Future对象控制这个方法.你可以发现这种情况,你需要提交任务给执行者在一个对象中,而处理结果在另一个对象中.基于这种情况,Java并发API提供CompletionService类. CompletionService 类有一个方法来提交任务给执行者和另一个方法来获取已完成执行的下个任务的Future对象.在内部实现中,它使用Executor对象执行任务

线程执行者(十)执行者控制一个任务完成

执行者控制一个任务完成 FutureTask类提供一个done()方法,允许你在执行者执行任务完成后执行一些代码.你可以用来做一些后处理操作,生成一个报告,通过e-mail发送结果,或释放一些资源.当执行的任务由FutureTask来控制完成,FutureTask会内部调用这个方法.这个方法在任务的结果设置和它的状态变成isDone状态之后被调用,不管任务是否已经被取消或正常完成. 默认情况下,这个方法是空的.你可以重写FutureTask类实现这个方法来改变这种行为.在这个指南中,你将学习如何

线程执行者(五)运行多个任务并处理第一个结果

运行多个任务并处理第一个结果 在并发编程中的一个常见的问题就是,当有多种并发任务解决一个问题时,你只对这些任务的第一个结果感兴趣.比如,你想要排序一个数组.你有多种排序算法. 你可以全部启用它们,并且获取第一个结果(对于给定数组排序最快的算法的结果). 在这个指南中,你将学习如何使用ThreadPoolExecutor类的场景.你将继续实现一个示例,一个用户可以被两种机制验证.如果使用其中一个机制验证通过,用户将被确认验证通过. 准备工作- 这个指南的例子使用Eclipse IDE实现.如果你使

线程执行者(六)运行多个任务并处理所有结果

运行多个任务并处理所有结果 执行者框架允许你在不用担心线程创建和执行的情况下,并发的执行任务.它还提供了Future类,这个类可以用来控制任务的状态,也可以用来获得执行者执行任务的结果. 如果你想要等待一个任务完成,你可以使用以下两种方法: 如果任务执行完成,Future接口的isDone()方法将返回true. ThreadPoolExecutor类的awaitTermination()方法使线程进入睡眠,直到每一个任务调用shutdown()方法之后完成执行. 这两种方法都有一些缺点.第一个