Java线程池总结笔记

来源:互联网 发布:家庭网络需要交换机吗 编辑:程序博客网 时间:2024/04/30 06:49
早上看了篇不错的介绍线程池的文章,细读了下,笔记如下:

  1. 使用线程池的好处:
    1. 降低资源消耗
    1. 提高响应速度
    1. 提高线程可管理性
  1. 线程饱和策略:
    1. AbortPolicy -直接抛出异常
    2. CallerRunsPolicy -只用调用者所在的异常来运行任务
    1. DiscardOldestPolicy -丢弃队列里最近的一个任务,并执行当前任务
    1. DiscardPolicy -不处理,直接丢掉
    1. 实现RejectedExecutionHandler接口自定义策略
  1. 两种向线程池提交任务的方式:
    1. execte方法 -无返回结果(无法判断线程是否被执行成功)
    1. submit方法 -放回future(根据futureget方法可获取返回值)
  1. 线程关闭的两种方法
    1. shutdown方法 -只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程
    1. shutdownNow方法 -先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停的任务的线程,并返回等待执行任务的列表。
  1. 线程池处理流程:
    1. 首先线程池判断基本线程池(corePoolSize)是否已满,如果没满,则创建一个工作线程来执行任务。
    1. 其次线程池判断工作队列(runnableTaskQueue)是否已满,如果没满,则将新提交的任务存储在工作队列里。
    1. 最后线程池判断整个线程池(maximumPoolSize)是否已满,如果没满,则创建一个新的工作线程来执行任务,如果满了,则交给饱和策略来处理这个任务。
  1. 线程池的特性分类和对应配置:
    1. 任务的性质:
      1. CPU密集型任务(CPU密集型任务配置尽可能小的线程
      1. IO密集型任务和混合型任务(IO密集型任务配置尽可能多的线程
    1. 任务的优先级:高,中和低。--使用优先级队列PriorityBlockingQueue来处理
    1. 任务的执行时间:长,中和短。
      1. 交给不同规模的线程池来处理
      1. 使用优先级队列,让执行时间短的任务先执行
    1. 任务的依赖性:是否依赖其他系统资源,如数据库连接。
      1. 依赖等待时间越长,线程池应该设置越大
      1. 使用有界队列而非无界队列,防止撑爆内存

 

  1. 线程池的监控:

重写beforeExecuteafterExecuteterminated方法,可以在任务执行前,执行后和线程池关闭前做一些事情。


原文链接:http://www.infoq.com/cn/articles/java-threadPool 有兴趣直接看原文更爽。