线程池的工作原理

线程池,就是存放线程的池子,池子里存放了很多可以复用的线程

作用:

1.对线程进行统一管理

2.降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗

3.提高响应速度。当有任务到达时,无需等待新线程的创建便能立即执行

4.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗大量系统资源,还会降低系统的稳定性,使用线程池可以进行对线程进行统一的分配、调优和监控

七大参数:

1.核心线程数

2.最大线程数

3.线程空闲时的存活时间

4.线程空闲时的存活时间的时间单位

5.任务缓存队列,用来存放等待执行的任务

6.线程工厂,创建新线程时使用的线程工厂

7.任务拒绝策略

当阻塞队列满了,且线程池中的线程数达到maximumPoolSize,如果继续提交任务,就会采取任务拒绝策略处理该任务,线程池提供了4种任务拒绝策略:

* AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;

* CallerRunsPolicy:由调用execute方法的线程执行该任务;

* DiscardPolicy:丢弃任务,但是不抛出异常;

* DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)

常用的线程池

1.newFixedThreadPool线程池 (固定大小线程池)

由参数可知 核心线程 和额外线程值是相同的,额外线程被回收时间是0,采用的是无界队列。默认采用的拒绝策略为AbortPolicy。分析得 核心线程和额外线程处理不过来得情况,会一直往队列里面放任务

可能存在的问题:队列过大 导致内存溢出 OOM

线程池的工作原理_第1张图片

 2.将额外线程设置成最大

当任务量足够大,超过队列。交由额外线程处理。就会创建过多线程

可能存在问题:特殊场景下,线程过多可能会导致系统奔溃。cpu负载过高

线程池的工作原理_第2张图片

 

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