老师您好,面试遇到一个问题,老师能看下吗?
来源:8-3 线程池-3
![](http://img1.sycdn.imooc.com/user/545863080001255902200220-100-100.jpg)
zgscy100
2019-03-04
老师您好,我今天面试遇到一个问题,当问到用newCachedThreadPool线程池会遇到那些问题,回答可能会出现OMM,接着又问怎么避免出现OMM,出现之后怎么处理?回答不上来,老师有这方面的经验没有?希望老师能够解答一下
2回答
-
Jimin
2019-03-04
你好,并发相关的面试题都可以拿出来讨论一下。
当前这个问题主要是考察newCachedThreadPool的使用,这个其实最直接的方法是打开看一下他的源码:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}通过这个可以直接看到他这里允许的线程数为 Integer.MAX_VALUE, 这代表线程数无限大了,正因为线程数可以那么多,所以才可能出现oom,要解决这个问题,根本上就是自己定义个方法,线程数设置一个合理的上限,比如:
return new ThreadPoolExecutor(0,1024,60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
尽管newCachedThreadPool有oom的可能,但不代表不可以使用它,它的缺陷是线程不断增大时可能oom,那么避开这种线程可以不断增加的情况,对于开启线程数有限的场景(比如课程里的例子,我们指定了开启的线程数,去做累加),就可以使用了。
祝你学习愉快~
10 -
zgscy100
提问者
2019-03-05
谢谢老师解答,另外有个问题,当线程池在执行的过程中,出现宕机时,这个时候线程中没有执行完的任务,怎么处理才能不丢失呢?
012019-03-05
相似问题