首页 > 其他分享 >线程池 keepAlivetime 参数详解

线程池 keepAlivetime 参数详解

时间:2022-10-13 10:55:15浏览次数:54  
标签:执行 poll 队列 keepAlivetime 任务 详解 线程 超时

线程池七大参数  核心线程数,最大线程数,任务队列,超时时间,时间单位,线程工厂,拒绝策略

线程池执行流程 :

添加一个任务到线程池  ->  判断当前线程数量是否大于核心线程数  ,如果不大于,创建新线程执行任务,将线程添加到线程池中 。

                     如果大于 -> 判断任务队列是否满,如果不满,将任务加入任务队列等待核心线程执行 ,

                     如果满了 -> 判断当前线程数量是否小于最大线程数,如果小于 创建新线程执行任务,并将线程加入线程池

                     如果当前线程数等于 最大线程数, 执行拒绝策略

keepAliveTime 非核心线程存活时间,标记非核心线程空闲多久后被干掉

                   首先明确 一个概念,并没有标记哪条线程是核心线程,哪条线程是非核心线程。 并且也不会创建一条线程去检测现有线程来实现超时杀掉

                  线程池中,线程会一直扫描工作队列,去工作队列中拿任务,然后去执行,工作队列中拿任务有两种方式 take() ,poll()

                  take() 当工作队列不存在的时候会阻塞,直到工作队列中有任务解除阻塞,拿到队头任务去执行并移除。

                  poll ()当工作队列中没有任务时,会直接返回 null  ,但是当携带参数时会 等待参数时间,此时的参数时间就是 keepAliveTime ,如果超时后还不能从队列中拿到任务,就会返回 null  作为提示,此时线程任务就会释放当前线程,干掉

                  那么此时就需要判断什么时候执行  take() 什么时候执行 poll ,很明显,当 现有线程大于 核心线程时会调用 poll ,

                   boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

                  allowCoreThreadTimeOut  是否允许核心线程超时销毁,此处可以忽略  

                  如果不小于,那么就执行 take()会将线程阻塞,达到保护线程不死的目的。

那么poll 方法 是如何实现超时检测的  ?

                  poll 方法会一直调用 available.awaitNanos(nanos)  一旦返回 超时 ,就返回 null  , nanos  是超时时间 就是此时的 keepAliveTime ,    available.awaitNanos()   下面调用  native  方法 

                  

                    

标签:执行,poll,队列,keepAlivetime,任务,详解,线程,超时
From: https://www.cnblogs.com/haodongshuai/p/16787392.html

相关文章

  • 雪花算法详解(原理优缺点及代码实现)
    目录雪花算法简介雪花算法的优缺点雪花算法原理雪花算法代码实现雪花算法简介雪花算法,英文名为snowflake,翻译过来就是是雪花,所以叫雪花算法。在大自然雪花形......
  • 面试官:Java 多线程怎么做事务控制?一半人答不上来。。
    项目代码基于:MySql数据,开发框架为:SpringBoot、Mybatis开发语言为:Java8前言公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。于是......
  • SynchronousQueue详解
    SynchronousQueue介绍【1】SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take。 ......
  • C#中的泛型详解
    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(typeparameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其......
  • PriorityBlockingQueue详解
    PriorityBlockingQueue介绍【1】PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,也可以指定数组的长度,且可以无限的扩充,直到资源消耗......
  • java-多线程
    java-多线程 以下内容为本人的学习笔记,如需要转载,请声明原文链接https://www.cnblogs.com/lyh1024/p/16786357.html 多线程1.进程与线程1.1什么是进程程序是指......
  • Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解
    一、定义flask-migrate是基于Alembic的一个封装,并集成到Flask中所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中。二、Flask-Migrate安装......
  • 151-《大数据架构师》Flink Slot 管理 和 Task 部署执行详解_ev
    总结之前内容          ......
  • token机制详解,JWT的使用
    cookie,session、token介绍参考文章:https://www.cnblogs.com/liuqingzheng/p/8990027.htmlcookie:存储在用户端的一-小段文本,用于服务器识别用户的一种技术。cookie是......
  • 【NLP-词向量】从模型结构到损失函数详解word2vec
    上周我们讲到,在进行NNLM训练时,能够得到副产品,词向量。本文介绍一种专门用于词向量制备的方法:word2vec,利用它能够高效的训练出词向量。作者&编辑|小Dream哥1word2vec是什......