线程池使用无界队列时可能会内存溢出的情况

当我们使用线程池时,如果用到的阻塞队列为LinkedBlockingQueue,默认大小是Integer.MAX_VALUE
线程池使用无界队列时可能会内存溢出的情况_第1张图片
这样就会出现一种情况,如果核心线程因某些情况一直被阻塞(比如说请求外部的服务因网络原因一直阻塞),那么后边来的线程都会放入这个阻塞队列中,慢慢地可能就会导致这个内存不足

代码模拟:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5,10,60L, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());
        while (true) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"启动");
                    try {
                        Thread.sleep(100000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

线程池使用无界队列时可能会内存溢出的情况_第2张图片

你可能感兴趣的:(Java多线程)