zoukankan      html  css  js  c++  java
  • ThreadPoolExecutor线程池中线程不能超过核心线程数量的问题

         int arg1=2;//核心线程
            int arg2=40;//最大线程数量
            int arg3=100;//空余保留时间
            
            ThreadPoolExecutor pool=new ThreadPoolExecutor(arg1, arg2, arg3,TimeUnit.MILLISECONDS, // 时间单位
    
         new LinkedBlockingQueue<Runnable>());//默认构造的队列大小为Integer.Max, 可指定大小new LinkedBlockingQueue<Runnable>(3),队列容量为3
            for(int i=0;i<10;i++){
    pool.execute(
    new Mythread(String.valueOf(i)));
         }

      在自定义的Mythread类的run方法中休眠一段时间(5秒),来模拟执行的任务,我原以为循环了10次,执行10个任务,由于小于最大线程数量40,线程池应该会新建10个线程来执行这10个任务,但是实验结果发现线程池中只有2个线程(即两个核心线程)来执行这10个任务,所以共执行了5*10/2=25s时间,而不是我想象中的5s。

      原因在于,LinkedBlockingQueue的容量默认大小是Integer.Max,在任务没有填满这个容量之前线程池大小是不会超过设定的核心线程数量2的。

      当制定LinkedBlockingQueue长度为3时,这10个线程任务有两个在核心线程中执行,有3个放在任务队列中,另外5个任务将另起新线程来执行。

    总结来说:核心线程满了,接下来进队列,队列也满了,创建新线程,直到达到最大线程数,之后再超出,会进入拒绝rejectedExecution


  • 相关阅读:
    Java 中日常使用的 IO 流总结
    NIO 实现非阻塞 Socket 通讯
    Java NIO 的简单介绍和使用
    常用设计模式 -- 一分钟就能学会的门面模式(外观模式)
    Java日志框架介绍和 Slf4j 使用
    Linux学习一
    JavaScript-数组
    javascript
    idea 快捷键汇总
    正则表达式
  • 原文地址:https://www.cnblogs.com/snailmanlilin/p/8005787.html
Copyright © 2011-2022 走看看