ExecutorService之内存溢出

探讨了使用固定线程池与异步传输导致的内存溢出问题,分析了10000个任务并发执行时的资源消耗,提出了通过手动调度和异步回调处理来优化解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 队列内存溢出
 	 ExecutorService exe = Executors.newFixedThreadPool(3);
     for (int j = 0; j < 10000; j++) {
          exe.execute(new MyThread());
          System.out.println("add:" + j);
      }

new 10000个对象放到LinkedBlockingQueue,在某些环境下会内存溢出

  • Thread对象内存溢出–巨坑
    上面写法,执行3个线程,10000个task自动调度,每次保证3个在执行
    class MyThread extends Thread {
        @Override
        public void run() {
            super.run();
           asyncPost(xxx);
        }
    }

但是这里线程里面,MyThread.asyncPost(xxx);用了异步传输,也就是 exe.execute(new MyThread());这个方法,秒执行完,并不是3个线程在调度,而是10000个同时在执行
解决:
1.asyncPost(xxx);异步传输会有回调,不用线程池,在回调new MyThread做手动调度,这里只能在异步回调里面处理。
尝试:

//        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
//        ExecutorService exe = new ThreadPoolExecutor(3, 5, 0L, TimeUnit.SECONDS, workQueue);

1.手动管理workQueue,失败

List<Future> list = new ArrayList<Future>();
//        ExecutorService exe = Executors.newFixedThreadPool(3);
//        int t = 0;
//        for(int sj = 0; sj<10;sj++){
//            MyThread thread = new MyThread();
//            Future future = exe.submit(thread);
//            list.add(future);
//            t+=1;
//            System.out.println("work:"+t);
//        }

2.监听future,对每个成功回调处理,失败
原因:这里workQueue执行完对标准和future.isDone的判断,都是MyThread()是否执行完,执行完workQueue.remove(task),或者future.isDone==true,而MyThread()是秒执行完的,因为它用了异步传输,所以只能异步回调里面开始下一个task

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值