JAVA如何使用线程池?

2025-11-23 10:01:07

1、将堆内存调整到10M:-Xms10m -Xmx10m

JAVA如何使用线程池?

1、Executors下面的newFixedThreadPool、newSingleThreadExecutor和newWorkStealingPool方法,都可能由于启动的线程过少,而任务却是一个又一个丢到队列中,导致内存溢出。

2、下面就是调用newFixedThreadPool,运行内存溢出的代码。

ExecutorService threadPool = Executors.newFixedThreadPool(4);


for (int i = 0; i < Integer.MAX_VALUE; i++) {


   threadPool.execute(new Runnable() {

       @Override

       public void run() {


           System.out.println(Thread.currentThread().getName());

       }

   });

}

JAVA如何使用线程池?

1、Executors下面的newCachedThreadPool和newScheduledThreadPool方法,可能由于创建过多的线程造成内存溢出。

2、下面就是调用newCachedThreadPool,运行内存溢出的代码。

ExecutorService threadPool = Executors.newCachedThreadPool();


for (int i = 0; i < Integer.MAX_VALUE; i++) {


   threadPool.execute(new Runnable() {

       @Override

       public void run() {


           try {

               Thread.sleep(5000);

           } catch (InterruptedException e) {

               e.printStackTrace();

           }


           System.out.println(Thread.currentThread().getName());

       }

   });

}

JAVA如何使用线程池?

1、针对newFixedThreadPool,引起内存溢出是因为LinkedBlockingQueue参数,因为LinkedBlockingQueue是长度为Integer.MAX_VALUE的队列,可以认为是无界队列,因此往队列中可以插入无限多的任务,在资源有限的时候容易引起OOM异常。

因而可以重写newFixedThreadPool方法,重新实现LinkedBlockingQueue,将里面的队列长度限定到合理范围。

JAVA如何使用线程池?

2、针对newCachedThreadPool,引起内存溢出是因为定义的线程池最大数量是Integer.MAX_VALUE。在任务比较耗时的时候,线程不能很快的复用,从而导致不断创建新的线程消耗资源,甚至引起OOM异常。

因而可以重写newCachedThreadPool,将线程池最大数量限定到合理范围,从而避免OOM的出现。

JAVA如何使用线程池?

3、其他Executors方法也可以参照上面修改。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢