ExecutorService之内存溢出

  • 队列内存溢出
 	 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 workQueue = new LinkedBlockingQueue();
//        ExecutorService exe = new ThreadPoolExecutor(3, 5, 0L, TimeUnit.SECONDS, workQueue);

1.手动管理workQueue,失败

List list = new ArrayList();
//        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

你可能感兴趣的:(ExecutorService,线程池内存溢出,其他)