线程池学习

坏处

线程是稀缺资源 频繁的创建销毁 消耗系统资源 降低系统稳定性

场景

创建线程时间t1

销毁线程时间t2

执行线程时间t3

如果t1+t2 > t3  浪费资源

好处

降低资源消耗

提高响应速度

提高线程的可管理性

工作原理

线程池判断核心线程池中的线程是否执行任务

如果不是  创建新的线程来执行任务

线程池判断阻塞队列是否已满

如果阻塞队列没满  任务存储在阻塞队列中等待

线程池判断线程是否都处于工作状态

如果没有  创建一个新的工作线程来执行任务

如果满了  交给饱和策略处理

/**

*      ThreadPoolExecutor

* corePoolSize    线程池的核心线程数  核心线程会一直存活(包括闲置状态)

* maximumPoolSize  线程池中最大线程数  当活动线程超过这个数量的时候  后面的任务会被阻塞

* keepAliveTime    线程存活时间

*                  如果allowCoreThreadTimeOut 为true  作用于核心线程

*                  如果allowCoreThreadTimeOut 为false 作用于非核心线程

*                  allowCoreThreadTimeOut会造成内存泄露  注意关闭

* unit            枚举类 keepAliveTime 单位

* workQueue        线程池中的阻塞队列  通过executor 方法存放到队列中

*                  SynchronousQueue  容量为0

*                  等待队列容量为0  所有需要阻塞的任务必须等待池内某个线程空闲 才能继续执行

*                  LinkedBlockingQueue  不限容量

*                  等待队列无穷大  在这种情况下不会有多于corePoolSize的线程存在  maximumPoolSize 不存在任何意义

*                  BlockingQueue  限制容量

* threadFactory    线程工厂  为线程池提供创建线程的功能

* handler          拒绝策略

*                  ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。

*                  ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。

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

*                  ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

*                   自定义拒绝策略  实现RejectedExecutionHandler接口

*/

/**

* 线程池状态

* RUNNING      创建线程池时

* SHUTDOWN    调用shutdown()方法 线程池不接收新的任务 等待所有任务执行完毕

* STOP        调用shutdownnow()方法  线程池不接收新的任务 终止正在执行的任务

* TERMINATED  当线程池处于SHUTDOWN/STOP状态  所有任务已经销毁 缓存队列已经清空或执行完毕后

*

* 如果线程池某个线程死掉了  线程池会生成一个新的线程代替他

*/

/**

*      FixedThreadPool

*          线程数量固定  空闲不会被回收 更快的响应速度 无超时机制 无大小限制

*          适合需要长时间连接的线程

*      CachedThreadPool

*          只有最大线程数为int 的最大值  超时60s  当整个线程池都为闲置状态  超过60s  会被回收  几乎不占用任何系统资源

*          适合执行大量的耗时较少的任务

*      ScheduledThreadPool

*          核心数量固定  非核心数量无限制  非核心线程闲置时立即被回收

*          执行定时任务和固定周期的重复任务

*      SingleThreadPool

*          只有一个核心线程

*          统一所有外界任务到一个线程中  所有任务之间不考虑线程同步

*/

你可能感兴趣的:(线程池学习)