1. 线程池来源的背景
- 在面向对象编程中,创建和销毁对象是很 费时间的,因为创建一个对象要获取内存 资源或者其它更多资源。
- Java虚拟机将试图跟踪每一个对象,以便 能够在对象销毁后进行垃圾回收。所以提 高服务程序效率的一个手段就是尽可能减 少创建和销毁对象的次数,特别是一些很 耗资源的对象创建和销毁。
池化技术: 池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。
在编程领域,比较典型的池化技术有:线程池、连接池、内存池、对象池等。
2. 线程池的作用
减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行集合任务时使用的线程)的方法。每个ThreadPoolExecutor还维护着一些基本的统计数据,如完成的任务数。
3. 线程池的原理
先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。
4. JDK线程池简介和使用
为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制。他们都在java.util.concurrent包中,是JDK并发包的核心。其中一个比较重要的类:Executors,扮演者线程工厂的角色,我们通过Executors可以创建特定功能的线程池。 Executors创建线程池的方法:
- newFixedThreadPool()方法,该方法返回一个固定数量的线程池,该方法的线程数始终不变,当有一个任务提交时,若线程池中空闲,则立即执行,若没有,则会被暂缓在一个任务队列中等待有空闲的线程去执行。
- newSingleThreadExecutor()方法,创建一个线程的线程池,若空闲则执行,若没有空闲则暂缓在任务队列中。
- newCachedThreadPool()方法,返回一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,若用空闲的线程则执行任务,若无则不创建线程。并且每一个空闲线程会在60秒后自动回收。
- newScheduledThreadPool()方法,该方法返回一个SchededExecutorService对象,但该线程池可以指定线程的数量。
以上4中方法的本质内部底层都是实际创建的都是一个ThreadPoolExecutor对象,只是对ThreadPoolExecutor构造方法,进行了默认值的设定。
在以上方法不足以供我们使用时,可以自己定义线程池,构造方法如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {…}
构造器参数介绍
corePoolSize 核心线程数(表示线程池初始化的时候就存在多少个线程);
maximumPoolSize 线程池最大容量大小;
keepAliveTime 线程池空闲时,线程存活的时间;
TimeUnit 时间单位;
ThreadFactory 线程工厂;
BlockingQueue任务队列(线程数大于线程池中线程的数量发布放入的队列);
RejectedExecutionHandler 线程拒绝策略;(例如线程池中有两个线程,若这两个线程都被占用第3个线程来了可以设定拒绝策略拒绝这个线程)