zoukankan      html  css  js  c++  java
  • Java executors创建线程池和使用ThreadPoolExecutor

    Java.util.concurrent包下

    executors创建线程池

    1. Executors.newFixedThreadPool()

       创建一个定长的线程池,每提交一个任务就创建一个线程,直到达到池的最大长度,这时线程池会保持长度不再变化

    固定数量的核心线程

    虽然线程数量是固定的,但是阻塞队列是无界队列。如果有很多请求积压,阻塞队列越来越长,容易导致OOM

    (无界队列其实是用了默认参数Integer.MAX_VALUE,一般来说,不应该允许那么多请求等待)

     

     

     

    2. Executors.newCachedThreadPool()

       创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活的回收空闲的线程,当需要增加时,  它可以灵活的添加新的线程,而不会对池的长度作任何限制

    无核心线程

    线程数量不固,和1.一样请求一多,容易OOM

     

    3. Executors.newScheduledThreadPool()

       创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer

    1.类似,支持定时和周期性任务执行

    也是无界队列

     

    4. Executors.newSingleThreadExecutor()

       创建一个单线程化的executor,它只创建唯一的worker线程来执行任务

    必须前一项任务执行完毕才能执行后一项。

     

    (核心线程和非核心线程的区别,没有区别,所谓核心线程是指线程不被销毁的数值范围,而哪些线程被销毁是随机的)

    概括:高并发情况无界队列会有OOM的风险,所以推荐做法是使用ThreadPoolExecutor(定时和周期性任务使用ScheduledThreadPoolExecutor)

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

     
    创建一个新的 ThreadPoolExecutor与给定的初始参数和默认线程工厂和拒绝执行处理程序。  

    corePoolSize 核心线程数量

    maximumPoolSize 最大线程数量

    keepAliveTime 线程保持时间,N个时间单位

    unit 时间单位(比如秒,分)

    workQueue 阻塞队列

    threadFactory 线程工厂

    handler 线程池拒绝策略

  • 相关阅读:
    1.时间复杂度与空间复杂度分析
    数据结构与算法之重头再来
    MySQL时间字段与业务代码取出的时间不一致问题
    [redtiger]在线靶场level3
    win10 卡顿 MsMpEng.exe进程
    react 笔记 局部打印 print
    react table td 自动换行
    kali apt-get update release文件过期
    ubuntu怎么切换到root用户,切换到root账号方法
    winscp连接kali 使用预置密码验证 拒绝访问
  • 原文地址:https://www.cnblogs.com/shineyoung/p/11321468.html
Copyright © 2011-2022 走看看