Java 线程池

线程池作用

  • CPU资源隔离
  • 减少上下文切换
  • 减少线程创建/关闭的资源开销
  • 更好并发控制
  • 更好生命周期控制

设计时注意事项

  • 任务混杂
  • 任务依赖
  • 饥饿死锁
  • 慢操作

使用时注意事项

线程池参数

  • 核心池大小(core pool size)
  • 最大池的大小(maximum pool size)
  • 存活时间(keep-alive time)
  • 缓冲队列(work queue)

任务队列(BlockingQueue)

  • 无限队列
    • LinkedBlockingQueue
      • newSingleThreadExecutor
      • newFixedThreadPool
  • 有限队列

    • ArrayBlockingQueue
    • LinkedBlockingQueue(int capacity)
    • 饱和策略
      • setRejectedExecutionHandler
      • ThreadPoolExecutor.AbortPolicy
        • 中止策略(默认)
        • 抛出RejectedExecutionException
        • 调用者捕获后,自行实现逻辑
    • ThreadPoolExecutor.CallerRunsPolicy
      • 不丢弃任务
      • 不抛出异常
      • 把任务退回调用者线程执行(同步调用)
    • ThreadPoolExecutor.DiscardOldestPolicy
      • 遗弃最旧的任务
      • 选择本应该接下来就要执行的任务
        • 会尝试再次提交
      • 如果使用优先级队列,则丢弃优先级最高的元素
      • 配合 SynchronousQueue 使用,可以实现任务提交并等待的效果
    • ThreadPoolExecutor.DiscardPolicy
      • 遗弃策略
      • 放弃这个任务
    • 可以结合Semaphore使用

      • 限制任务注入率(injection rate)
    • FIFO

  • 同步移交(synchronous handoff)
    • 直接传递给其他线程
    • SynchronousQueue
      • newCachedThreadPool

线程工厂

  • 设置异常处理 UncaughtExceptionHandler

  • 设置线程名称

  • 优先级(不建议)
  • 守护线程(不建议)
  • 增加额外的计数器
  • 增加额外的统计信息
  • Executors.privilegedThreadFactory(),使用安全策略创建线程

执行策略

  • 执行任务,不关心结果
    • void execute(Runnable command)
  • 执行任务,需要对结果进行处理
    • Future submit(Callable task)
    • Future submit(Runnable task)
    • Future submit(Runnable task, T result)
  • 执行一批任务,需要全部成功完成
    • List invokeAll(Collection<? extends Callable> tasks)
    • List invokeAll(Collection<? extends Callable> tasks, long timeout, TimeUnit unit)
  • 执行一批任务,只需要有一个成功完成即可
    • T List invokeAny(Collection<? extends Callable> tasks)
    • T invokeAny(Collection<? extends Callable> tasks, long timeout, TimeUnit unit)
  • 执行一批任务,需要逐个处理结果
    • CompletionService
      • ExecutorCompletionService
  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/bc557e1a.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!