线程池的基本理解以及使用

首先线程池是一种管理和复用线程的机制,它可以用来提高多线程编程的效率和性能。

线程池的概念:
线程池是一种线程管理的机制,它通常由一个线程池管理器(ThreadPoolExecutor)和一组线程组成。线程池管理器负责创建、管理和调度线程。当任务到达时,线程池会从线程池中预先创建的线程中选一个来执行任务,如果没有空闲线程,则将任务放入等待队列中,等待执行。

线程池的优点:
1. 资源管理:线程池可以避免频繁地创建和销毁线程,从而节约系统资源。
2. 提高性能:线程池可以提供线程复用,避免线程的频繁切换和创建,降低了线程创建和销毁的开销,提高了系统的响应速度和吞吐量。
3. 提供线程的可管理性:线程池可以限制并发线程的数量,通过对线程的管理和调度,防止线程的堆积和资源耗尽。
4. 控制并发:线程池可以通过设置线程数量限制来控制并发度,以避免系统因并发过高而导致资源抢占和竞争造成的问题。

线程池的缺点:
1. 配置管理复杂:合理配置线程池的核心线程数、最大线程数、队列大小等参数需要对系统负载特性和任务资源需求进行分析,配置不当可能导致性能下降或资源浪费。
2. 对于短时间的高并发请求,线程池可能无法满足需求,因为线程池的线程数是有限的。

线程池的工作流程如下:
1. 创建线程池,指定线程池的配置参数,如核心线程数、最大线程数、队列大小等。
2. 当有任务到达时,线程池会按照一定的策略选择一个空闲的线程来执行任务,如果没有空闲线程,则执行下一步。
3. 如果线程池的线程数小于最大线程数,则创建一个新的线程来执行任务,如果线程数已达到最大线程数,则执行下一步。
4. 将任务放入等待队列,等待执行。
5. 当有线程执行完任务后,会继续从等待队列中取出任务执行,直到所有任务执行完毕。
6. 关闭线程池。

总结:

线程池是一种用来管理和复用线程的机制,它可以提高多线程编程的效率和性能。线程池的优点包括资源管理、性能提升和线程的可管理性,缺点是配置管理复杂和对于短时间的高并发请求可能无法满足需求。

Java中提供了Executor框架,来创建和管理线程池。主要包括以下四种。

1. FixedThreadPool固定大小线程池:
 

ExecutorService executorService = Executors.newFixedThreadPool(5);


创建一个固定大小的线程池,一旦池中所有的线程都被使用完,新的任务就会等待,直到有线程空闲出来。

2. CachedThreadPool可缓存线程池:

 

ExecutorService executorService = Executors.newCachedThreadPool();


创建一个可缓存的线程池。如果线程池的当前规模超过了处理需求,那么就会回收空闲线程,当需求增加时,也可以添加新的线程。

3. SingleThreadExecutor单线程池:

 

ExecutorService executorService = Executors.newSingleThreadExecutor();



创建一个单线程执行程序,它可以进行串行执行所有提交的任务。

4. ScheduledThreadPool定时或周期执行线程池:

 

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);



创建一个线程池,它可以安排在给定延迟后运行命令,或者定期执行任务。

以上创建线程池的方式都可使用execute(Runnable) 或 submit(Runnable/Callable) 去提交任务,其中submit()方法可有返回值。

使用线程池的主要原因是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足,系统繁忙超负荷等问题。如果不使用线程池,自己手动创建线程的话,可能会遇到OOM等问题。

注:Executors对线程池的支持主要通过四种线程池工厂方法来体现:

1) newFixedThreadPool 创建一个可重用固定线程数的线程池
2) newCachedThreadPool 创建一个可缩小线程数的线程池
3) newSingleThreadExecutor 创建一个只包括一个线程的线程池
4) newScheduleThreadPool 创建一个线程池,执行定时任务,或者可以延迟执行的任务。

但在阿里巴巴Java开发手册中明确指出了:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让开发人员对线程池的运行规则有明确的认识,避免资源耗尽的风险。
一般构造一个ThreadPoolExecutor需要以下几个参数:

corePoolSize:线程池的基本大小
maximumPoolSize:线程池最大线程数

keepAliveTime(必需):线程闲置超时时长

unit(必需):指定 keepAliveTime 参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。
workQueue:线程等待队列
threadFactory:创建线程的工厂
rejectHandler:当线程池和队列都满了之后的饱和策略。

你可能感兴趣的:(java,开发语言)