美文网首页
二十一 线程池

二十一 线程池

作者: BeYearn | 来源:发表于2018-11-27 15:51 被阅读0次
图片.png
  1. 在大多数应用场景下,使用 Executors 提供的 下面5 个静态工厂方法就足够了:
  • newCachedThreadPool(),它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用 SynchronousQueue 作为工作队列。
  • newFixedThreadPool(int nThreads),重用指定数目(nThreads)的线程,其背后使用的是无界的工作队列,任何时候最多有 nThreads 个工作线程是活动的。这意味着,如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目 nThreads。
  • newSingleThreadExecutor(),它的特点在于工作线程数目被限制为 1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目。
  • newSingleThreadScheduledExecutor() 和 newScheduledThreadPool(int corePoolSize),创建的是个 ScheduledExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程。
  • newWorkStealingPool(int parallelism),这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序。
  1. 线程池(ExecutorService 父接口 Executor)这个定义就是个容易让人误解的术语,因为它除了通常意义上“池”的功能,还提供了更全面的线程管理、任务提交等方法.


    图片.png

线程池构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

  1. 线程池注意:
  • 避免任务堆积 如newFixedThreadPool是创建指定数目线程, 但其工作队列是无界的. 如果处理跟不上入队, 就可能占用大量内存,甚至OOM
  • 避免过度扩展线程
  • 如果线程数目不断增长(可用jstack检查) 警惕线程泄漏, 往往因为任务逻辑有问题,导致工作线程迟迟不能释放
  • 避免死锁
  • 避免在用线程池时使用ThreadLocal
  1. 线程池大小设定
  • 如果主要任务是计算, 则设定为cpu核数目N 或 N+1
    避免线程上下文切换造成的损耗

  • 如果是需要较多等待的工作, 如IO 则推荐
    线程数 = CPU 核数 × (1 + 平均等待时间 / 平均工作时间)
    因为io这些操作并不占用cpu,不要让cpu空闲下来,即加大线程数量

相关文章

  • 二十一 线程池

    在大多数应用场景下,使用 Executors 提供的 下面5 个静态工厂方法就足够了: newCachedThre...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • ThreadPoolExecutor线程池原理以及源码分析

    线程池流程: 线程池核心类:ThreadPoolExecutor:普通的线程池ScheduledThreadPoo...

  • 线程池

    线程池 [TOC] 线程池概述 什么是线程池 为什么使用线程池 线程池的优势第一:降低资源消耗。通过重复利用已创建...

  • java 线程池使用和详解

    线程池的使用 构造方法 corePoolSize:线程池维护线程的最少数量 maximumPoolSize:线程池...

网友评论

      本文标题:二十一 线程池

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