美文网首页
线程池学习

线程池学习

作者: 尹诗皓 | 来源:发表于2018-07-20 11:33 被阅读0次

坏处

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

场景

创建线程时间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

*          只有一个核心线程

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

*/

相关文章

  • [第三篇]深入学习线程池之优雅的关闭线程池

    通过 《深入学习线程池之线程池简介及工作原理》、《深入学习线程池之通过ThreadPoolExecutor创建线程...

  • Java学习Day14

    今日学习内容总结 线程池 Lambda表达式 线程池 线程池: 其实就是一个容纳多个线程的容器,其中的线程可以反复...

  • 线程池

    1.为什么要使用线程池?2.线程池的基本原理是什么?3.怎么学习线程池?线程池使用了池化技术。池化技术用于我们常见...

  • Java中的ThreadPoolExecutor线程池

    今天简单来和大家一起学习一下,java中的ThreadPoolExecutor线程池。 线程池简介 背书中,线程池...

  • juc.ExecutorService

    线程池技术学习 线程池的工作方式 如果运行的线程少于 corePoolSize,则 Executor 始终首选添加...

  • Android中线程池的使用分析

    引言:说起线程池,学习过Java基础的同学估计都不陌生,Android中的线程池其实就是java的线程池。那么为什...

  • java线程池总结

    线程池的学习总结 线程池的核心类是java.uitl.concurrent.ThreadPoolExecutor在...

  • Android进阶-线程池

    在上一篇文章(为什么要学习) AsyncTask 原理 提到了线程池,那么现在来学习学习 Android 的线程池...

  • 2021-03-10 阿里p6教你理解学习线程池

    阿里p6教你理解学习线程池 对线程或者线程池的理解程度(0-10) 线程:同时运行多个任务,提高任务处理能力 池化...

  • 简单理解Java四种线程池

    2019.03.09Android学习周记——java中的四种线程池并自己封装线程池 1. 线程(Thread) ...

网友评论

      本文标题:线程池学习

      本文链接:https://www.haomeiwen.com/subject/ldyfmftx.html