Java资源分享网 - 专业的Java学习网站 学Java,上Java资源分享网
【并发编程】如何优雅使用线程池 PDF 下载
发布于:2024-05-09 09:35:03
(假如点击没反应,多刷新两次就OK!)

【并发编程】如何优雅使用线程池  PDF 下载 图1

 

 

资料内容:

 

1、线程池引入
所谓线程池,通俗来讲,就是一个管理线程的池子。它可以容纳多个线程,其中的线程可以反复
利用,省去了频繁创建线程对象的操作。
Java 并发编程框架中的线程池是运用场景最多的技术,几乎所有需要异步或并发执行任务的
程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来至少以下4个好处:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗;
提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行;
提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会
降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。
提供更强大的功能,比如延时定时线程池;
 
2Executors
2.1、概述
Executors 是一个Java中的工具类。提供工厂方法来创建不同类型的线程池。
核心概念:这四个线程池的本质都是ThreadPoolExecutor对象:
newFiexedThreadPool(int Threads) : 创建固定数目线程的线程池。
newCachedThreadPool() : 创建一个可缓存的线程池,调用execute 将重用以前构
造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终
止并从缓存中移除那些已有 60 秒钟未被使用的线程。
newSingleThreadExecutor() : 创建一个单线程化的Executor
newScheduledThreadPool(int corePoolSize) : 创建一个支持定时及周期性的
任务执行的线程池,多数情况下可用来替代Timer类。
 
2.2Executors缺陷
在阿里巴巴Java开发手册中明确指出,不允许使用Executors创建线程池,这是因为使用
Executors创建线程池可能会导致OOM(OutOfMemory ,内存溢出)
 
 
3、优雅的创建线程池
3.1、正确挑选方法
避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调
ThreadPoolExecutor 的构造函数来自己创建线程池。在创建的同时,给 BlockQueue 指定
容量就可以了。
 
1 public ThreadPoolExecutor(int corePoolSize,
2                              int maximumPoolSize,
3                              long keepAliveTime,
4                              TimeUnit unit,
5                              BlockingQueue<Runnable> workQueue,
6                              ThreadFactory threadFactory,
7                              RejectedExecutionHandler handler)

 

上面放出来的是ThreadPoolExecutor的全参构造函数,其中的参数分别为:
corePoolSize :线程池中的核心线程数。指定线程数回一直存在与线程池中,除非设
置了 allowCoreThreadTimeOut参数。当创建完成之后就会准备好等待接收异步任务去
执行;
maximumPoolSize :最大线程数。当请求的线程超过最大线程数时,将会扩充线程数
量到最大线程数,但不会无限扩充,达到控制资源的效果;
keepAliveTime :非核心线程的存活时间。如果当前存活的线程数量大于核心线程数
corePoolSize,则会释放空闲的线程直到线程数回到最大线程数corePoolSize
unit keepAliveTime 参数的时间单位,如TimeUnit.SECONDS
workQueue :阻塞队列。用于保存多余的任务,如果任务很多,就会将多的任务存放进
队列中,只要有空闲的线程就会去队列中取出新的任务执行直到队列为空;
threadFactory :线程池工厂,标识线程,即为线程起一个具有意义的名称,可自定
义;
handler :拒绝策略。如果阻塞队列满了,就会按照我们指定的拒绝策略拒绝后续任
务,默认为丢弃任务。