线程池
线程池由两个核心数据结构组成:
1、线程集合(workers):存放执行任务的线程,是一个HashSet;
2、任务等待队列(workQueue):存放等待线程池调度执行的任务,是一个阻塞式队列BlockingQueue;
就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。
线程池的好处:
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
线程池的参数
-
corePoolSize: 线程池核心线程数
-
maximumPoolSize: 线程池最大线程数
-
keepAliveTime: 线程池中的线程出超过核心线程数时,空闲线程的最大存活时间
-
workQueue: 任务队列,需要是BlockingQueue,常见的有SynchronousQueue(无队列直接递交的队列),ArrayBlockingQueue, LinkedBlockingQueue(有界无界两种),DelayQueue(延迟队列), PriorityBlockingQueue(优先级队列)等
-
threadFactory: 创建线程的工厂,可以控制线程名称、priority等
-
handler: 拒绝策略,当队列已满,并且线程数量已经达到maximumPoolSize时,再提交的任务会交给RejectedExecutionHandler来处理,
- 常见的拒绝策略有AbortPolicy(直接拒绝并抛出异常),
- CallerRunsPoicy(由所在者的线程进行处理,这种策略会降低对于新任务提交速度,影响程序的整体性能。如果您的应用程序可以承受此延迟并且你要求任何一个任务请求都要被执行的话,你可以选择这个策略。),
- DiscardPolicy(不处理新任务,直接丢弃掉ÿ