先看个代码:

newFixedThreadPool

上面代码产生的问题

    生产两台服务器爆内存,被搞死了

分析原因

方法内部使用了线程池, 方法被请求一次,就会创建一个线程池,每个线程池都存活着一个线程, 并且被占用的内存不会被GC回收

o = future.get(1, TimeUnit.MILLSECONDS) ; 这行代码是为了获取异步线程的返回值,但是超时时间设置的太少 1毫秒,也会造成问题

结论

如果局部使用线程池,用完后不再使用它,一定记得手动关闭线程池,否则跑着跑着就内存爆炸崩溃。回收函数如下:
 //执行此函数后线程池不再接收新任务,并等待所有任务执行完毕后销毁线程。此函数并不会等待线程销毁完毕,而是立即返回的
executor.shutdown();
//如想要同步等待线程池完成关闭,可使用下面的函数判断是否都执行完毕了,该函数等待timeout后,返回是否所有任务都执行完毕了
pool.awaitTermination(timeout,TimeUnit)

//尝试结束所有活动线程,并返回等待队列里的任务
executor.shutdownNow();