对于FfixedThreadPool来说,如果当前任务数量小于核心线程数,并且有闲置的核心线程,那么新来的任务是交由空闲的核心线程执行还是新创建线程来执行?  因为在网上看到两种不同的说法,前来请教各位。

解决方案 »

  1.   

    你问这个问题问题证明没有好好看过ThreadPoolExecutor类的源码大概翻译一下 :如果正在运行的线程数量少于corePoolSize的线程,便尝试使用指定的命令作为其第一个任务启动新线程。 对addWorker的调用以原子方式检查runState和workerCount,因此通过返回false来防止在不应该添加线程时发生的错误警报。
    只有达到线程池中最大线程数maximumPoolSize才把任务放到链表队列LinkedBlockingQueue里  最大值为Integer.MAX_VALUEnewFixedThreadPool相当于创建一个定长的线程池  本质上调用的还是ThreadPoolExecutor public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
    }我上面截图的就是ThreadPoolExecutor 的execute方法
      

  2.   

    顺便 我说的可能有歧义了 我说的最大值Integer.MAX_VALUE是链表队列的最大任务数,线程池的最大线程数是你new时传递的形参
      

  3.   

    并发编程 之 ExecutorService 线程池 铁运行例子 http://www.verejava.com/?id=17266756343972