- 队列内存溢出
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