其实线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件。
下图描述的是线程池API的一部分。广义上的完整线程池可能还包括Thread/Runnable、Timer/TimerTask等部分。这里只介绍主要的和高级的API以及架构和原理。
大多数并发应用程序是围绕执行任务(Task)进行管理的。所谓任务就是抽象、离散的工作单元(unit of work)。把一个应用程序的工作(work)分离到任务中,可以简化程序的管理;这种分离还在不同事物间划分了自然的分界线,可以方便程序在出现错误时进行恢复;同时这种分离还可以为并行工作提供一个自然的结构,有利于提高程序的并发性。[1]
并发执行任务的一个很重要前提是拆分任务。把一个大的过程或者任务拆分成很多小的工作单元,每一个工作单元可能相关、也可能无关,这些单元在一定程度上可以充分利用CPU的特性并发的执行,从而提高并发性(性能、响应时间、吞吐量等)。
所谓的任务拆分就是确定每一个执行任务(工作单元)的边界。理想情况下独立的工作单元有最大的吞吐量,这些工作单元不依赖于其它工作单元的状态、结果或者其他资源等。因此将任务尽可能的拆分成一个个独立的工作单元有利于提高程序的并发性。
对于有依赖关系以及资源竞争的工作单元就涉及到任务的调度和负载均衡。工作单元的状态、结果或者其他资源等有关联的工作单元就需要有一个总体的调度者来协调资源和执行顺序。同样在有限的资源情况下,大量的任务也需要一个协调各个工作单元的调度者。这就涉及到任务执行的策略问题。
任务的执行策略包括4W3H部分:
- 任务在什么(What)线程中执行
- 任务以什么(What)顺序执行(FIFO/LIFO/优先级等)
- 同时有多少个(How Many)任务并发执行
- 允许有多少个(How Many)个任务进入执行队列
- 系统过载时选择放弃哪一个(Which)任务,如何(How)通知应用程序这个动作
- 任务执行的开始、结束应该做什么(What)处理
在后面的章节中会详细分写这些策略是如何实现的。我们先来简单回答些如何满足上面的条件。
- 首先明确一定是在Java里面可以供使用者调用的启动线程类是Thread。因此Runnable或者Timer/TimerTask等都是要依赖Thread来启动的,因此在ThreadPool里面同样也是靠Thread来启动多线程的。
- 默认情况下Runnable接口执行完毕后是不能拿到执行结果的,因此在ThreadPool里就定义了一个Callable接口来处理执行结果。
- 为了异步阻塞的获取结果,Future可以帮助调用线程获取执行结果。
- Executor解决了向线程池提交任务的入口问题,同时ScheduledExecutorService解决了如何进行重复调用任务的问题。
- CompletionService解决了如何按照执行完毕的顺序获取结果的问题,这在某些情况下可以提高任务执行的并发,调用线程不必在长时间任务上等待过多时间。
- 显然线程的数量是有限的,而且也不宜过多,因此合适的任务队列是必不可少的,BlockingQueue的容量正好可以解决此问题。
- 固定任务容量就意味着在容量满了以后需要一定的策略来处理过多的任务(新任务),RejectedExecutionHandler正好解决此问题。
- 一定时间内阻塞就意味着有超时,因此TimeoutException就是为了描述这种现象。TimeUnit是为了描述超时时间方便的一个时间单元枚举类。
- 有上述问题就意味了配置一个合适的线程池是很复杂的,因此Executors默认的一些线程池配置可以减少这个操作。
http://www.blogjava.net/xylz/archive/2010/12/19/341098.html
相关推荐
线程池的一个简介,包括什么是线程池,技术背景,线程池如何提高服务器的性能,如何使用线程池,线程池使用的时候应该注意的事项
### 线程池简介 线程池是由多个线程组成的集合,它预先创建了一定数量的线程,当有任务需要执行时,线程池会从已存在的线程中分配一个来执行任务,而不是每次需要时都新建一个线程。这样可以减少线程创建和销毁的...
2. `mcpage`线程池简介: `mcpage`是Marcoc Pagliarini开发的一个Delphi线程池组件,它支持任务调度、线程优先级设置、线程数量动态调整等功能。在Delphi项目中,我们可以利用`mcpage`轻松实现并发处理,提高程序...
一、`Executor`线程池简介 `Executor`框架是Java并发编程的重要组成部分,由`java.util.concurrent`包提供。它提供了一种更加灵活的方式来管理和执行任务,而不仅仅是简单的创建和启动线程。线程池通过重用已存在的...
【标题】:深入理解Tomcat线程池机制 【描述】:Tomcat作为最流行的Java Web容器,其高效处理请求的能力离不开线程池的优化。本文将详细解析Tomcat线程池的实现原理,帮助读者深入理解其工作方式。 【标签】:Tomcat ...
#### 线程池简介 线程池是一种管理线程的高效方法,它预先创建一组固定数量的线程,并将它们放置在一个池中。当有新的任务需要执行时,线程池中的空闲线程会被分配给该任务。任务完成后,线程返回线程池,等待处理...
Hystrix线程池简介 Hystrix是一个开源的分布式系统解决方案,提供了完善的线程池管理机制。Hystrix线程池是基于Java的线程池实现,提供了高效、可靠的线程池管理机制。Hystrix线程池的主要特点是: * 高效:...
"readme.txt"文件通常会提供项目简介、使用说明、注意事项等信息,对于理解整个项目非常有帮助。 "DotNetInfra.ThreadingServices.sln"是Visual Studio的解决方案文件,包含了项目的所有配置信息,可以用来打开和...
#### 一、线程池的简介 线程池技术在现代软件开发中扮演着至关重要的角色,尤其是在处理高并发场景下的任务调度时。传统上,我们通常通过在需要时创建新线程的方式来处理任务。然而,在一些特殊的应用场景下(如Web...
#### 一、简介 线程在Java中扮演着至关重要的角色。在早期的JDK版本(如JDK 1.4及之前)中,线程池的功能相对简单,使用起来不够灵活。然而,自JDK 1.5开始,随着`java.util.concurrent`包的引入,Java线程池的功能...
#### 一、线程池简介 线程池是多线程环境中用于管理和控制线程的一种机制。通过线程池可以有效地管理线程生命周期,提高响应速度和系统吞吐量,减少线程创建和销毁带来的开销。 #### 二、创建自定义线程池 在Java中...
线程池简介 线程池是一种线程使用模式,它预先创建一定数量的线程,当需要执行新任务时,从线程池中取出一个线程来执行任务,而不是每次都创建新的线程。这减少了创建和销毁线程的开销,提高了系统响应速度。 ###...
VC6.0简介: Visual C++ 6.0是微软推出的一款集成开发环境,用于编写C++应用程序。虽然版本较旧,但因其经典和兼容性,至今仍被一些开发者用于教学和小型项目开发。 线程池实现的关键点: 1. **线程对象**:线程池...
corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的...
JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介
JDK1.5中的线程池(ThreadPoolExecutor)使用简介
##### 4.1 线程池简介 线程池是一种管理多个工作线程的机制,它可以重用预创建的线程,避免频繁创建和销毁线程的开销。线程池通常由以下部分组成: - **核心线程数量**:线程池中始终维持的线程数量。 - **最大线程...
java自定义线程池的原理简介 java自定义线程池的原理简介是Java开发中非常重要的一种技术,它可以帮助我们更好地管理线程池,提高系统的性能和可靠性。在这篇文章中,我们将详细介绍java自定义线程池的原理详解,...
**线程池简介** 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效地管理和控制并发执行的任务数量,避免了频繁地创建和销毁线程所带来的开销。在C++中...