老师您好,面试遇到一个问题,老师能看下吗?

来源:8-3 线程池-3

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,那么避开这种线程可以不断增加的情况,对于开启线程数有限的场景(比如课程里的例子,我们指定了开启的线程数,去做累加),就可以使用了。

祝你学习愉快~


1
0

zgscy100

提问者

2019-03-05

谢谢老师解答,另外有个问题,当线程池在执行的过程中,出现宕机时,这个时候线程中没有执行完的任务,怎么处理才能不丢失呢?

0
1
Jimin
线程池可以考虑添加jvm钩子做优雅重启,但是对于java进程直接消失(比如断电)那种是真的没办法,这种场景基本只能根据之前遗留的日志或者定时任务扫描数据库数据辅助判断,前提还得是有日志或者数据库数据能对出来。
2019-03-05
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程