线程池

  1. 不推荐使用 - 数据量巨大

    newCacheThreadPool、newFixedThreadPool、newSingleThreadPool

    容易发生 OOM,缓存线程池队列有存活时间,但无线程数量限制,容易 cpu100%,其他两个都是无界队列

  1. 自定义线程

    1. 两个优先级
      1. 提交优先级
        1. 添加核心线程
        2. 线程满了放入队列
        3. 队列放慢后增加到最大线程
        4. 全满后调用拒绝策略
      2. 执行优先级
        1. 优先执行现有任务、最后执行队列任务
    2. submit 和 execute 有什么区别
      1. submit 调动了 execute 方法,submit 有返回值,execute 没有
    3. 新增线程时做了什么 addWorker(Runnable firstTask, boolean core) 使用了 goto 语句
      1. 查看线程池状态
      2. 判断是否线程是否满了
    4. 执行任务做了什么 runWorker(Worker w)
    5. run() 方法是调用方法,start() 是创建线程调用
  2. 定时线程池

    1. 三种方法
      • schedule() 一次性
      • scheduleWithFixedDelay 任务完成时间后 + 延迟时间为一周期
      • scheduleAtFiexedRate 是以 period 为间隔来执行任务的,少等超执 周期固定
    2. 提交优先级为队列第一
    3. periodic 设置为 1 才判断为周期性任务