- 为什么使用线程池
为每个请求创建新线程的服务器在创建和销毁线程上花费的时间要比花在处理实际的用户请求更多。
每创建一个线程都需要在堆上分配内存空间,同时需要分配虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间,当这个线程对象被可达性分析算法标记为不可用时被GC回收,这样频繁的创建和回收需要大量的额外资源开销。
再者说,JVM的内存资源是有限的,如果系统中大量的创建线程对象,JVM很可能直接抛出OutOfMemoryError异常。
最后,大量的线程去竞争CPU会产生其他的性能开销,更多的线程反而会降低性能,所以必须要限制线程数。
2.ThreadPoolExecutor定义了七大核心属性,这些属性是线程池实现的基石。
拒绝策略
rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下
AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
创建各种线程池
由于ThreadPoolExecutor的参数过多,JDK Executors 类中提供了众多工厂方法来创建各种用途的线程池
创建线程池的四种方式:
参考链接:https://blog.csdn.net/JunSIrhl/article/details/106873150