线程池中的最大线程数不正确

时间:2019-09-23 06:52:26

标签: java threadpool executorservice threadpoolexecutor

我有一个线程池,最大线程数为3。但是仅执行了一个线程,发生了什么事?

public class Volatile {

    private volatile static boolean keepA = true;
    private static boolean keepB = true;

    private static ExecutorService executor = new ThreadPoolExecutor(1,
            3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>() );

    public static void main(String[] args) {
        executor.execute(() -> {
            while (keepA) {
                System.out.println("keepA running...");
            }
            System.out.println("keepA stop!!!!!!");
        });
        executor.execute(() -> {
            while (keepB) {
                System.out.println("keepB running...");
            }
            System.out.println("keepB stop!!!!!!");
        });
        executor.execute(() -> {
            keepA = false;
            keepB = false;
        });
        while (true) {

        }
    }
}

结果

  

保持运行...
  keepA正在运行...
  keepA正在运行...
  ......

2 个答案:

答案 0 :(得分:3)

仅当队列已满(并且队列无限制,因此永远不会发生)时,才会启动非核心线程。

per Javadoc

  

任何BlockingQueue均可用于传输和保留提交的任务。此队列的使用与池大小交互:

     
      
  • 如果正在运行的线程数少于corePoolSize,则执行程序总是喜欢添加新线程而不是排队。
  •   
  • 如果正在运行corePoolSize或更多线程,则执行程序总是更喜欢对请求进行排队,而不是添加新线程
  •   
  • 如果无法将请求放入队列中,则将创建一个新线程,除非该线程超过了maximumPoolSize,在这种情况下,该任务将被拒绝。
  •   

答案 1 :(得分:1)

ThreadPoolExecutor的第一个参数是并行运行的线程的初始数量。您已将其设置为1。将其更改为3,然后重试。仅当队列已满时,此大小才应增加,但是队列的大小是无限的,并且永远不会满。

public ThreadPoolExecutor(int corePoolSize,
              int maximumPoolSize,
              long keepAliveTime,
              TimeUnit unit,
              BlockingQueue<Runnable> workQueue)
     

使用给定的初始参数和默认值创建一个新的ThreadPoolExecutor   拒绝执行处理程序。

     

参数:

     
      
  • corePoolSize-的数量   即使线程空闲,也要保留在池中的线​​程,除非   allowCoreThreadTimeOut已设置

  •   
  • maximumPoolSize-的最大数量   池中允许的线程

  •   
  • keepAliveTime-当   线程大于核心,这是超出的最大时间   空闲线程将在终止之前等待新任务。

  •   
  • unit-   keepAliveTime参数

  • 的时间单位   
  • workQueue-要使用的队列   用于在执行任务之前保留任务。此队列将仅容纳   execute方法提交的可运行任务。

  •   
     

投掷:

     
      
  • IllegalArgumentException-如果满足以下条件之一:

    `corePoolSize < 0`
    `keepAliveTime < 0`
    `maximumPoolSize <= 0`
    `maximumPoolSize < corePoolSize` 
    
  •   
  • NullPointerException-如果workQueuethreadFactory为   null

  •