问一下关于Executors类的问题

使用Executors创建线程池的话,比如使用newFixedThreadPool()创建固定大小的线程池,但是它的阻塞队列是无界的(Integer.Max),那么如果任务足够多,不停的添加到阻塞队列,会不会导致内存溢出?难道JDK没有考虑这个问题吗?

阅读 2.1k
2 个回答

的确会有问题的,所以你可以直接使用new ThreadPoolExecutor来构建一个使用有边界队列的线程池,可以参考Executors里的代码:

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

把LinkedBlockingQueue换掉就行了。

会溢出的,所以要看情况使用哪几种类型的线程池

没问题啊 1 是会溢出的啊 2 jdk怎么会没考虑这个问题(这还用回答)

所以建议不要用Executors.newFixedThreadPool() 这种 而是自己new ThreadPoolExecutor 指定队列 而不是无界队列
对于溢出 看你并发量的 已经设置的线程数 tomcat 也就支持几百并发 你这个线程池不太可能溢出 除非你乱搞

推荐问题