龙空技术网

阿里一面:Java的Executors创建线程池有什么缺点?

JAVA面试官 761

前言:

当前姐妹们对“线程池有什么缺点”大概比较看重,咱们都想要知道一些“线程池有什么缺点”的相关内容。那么小编同时在网络上汇集了一些对于“线程池有什么缺点””的相关资讯,希望我们能喜欢,兄弟们一起来了解一下吧!

使用Executors创建线程池很方便,那么它有些什么缺点呢?

newFixedThreadPool

在用Executors的去调用newFixedThreadPool方法去创建一个线程池的时候,看一下这个方法是怎么实现的,它其实底层是用的 ThreadPoolExecutor,很底层的一个线程池的实现类。

这个构造方法最关键的一个点,就是LinkedBlockingQueue,它表示无界的阻塞队列。有人可能一下子反应不过来,那么看到这个linked,相当于就是就是链表的意思。无界会导致一个可能会很严重的问题,如果说我们现在创建出来这个线程池,去提交任务,在线程数一定的情况下,如果说任务很多,那么这些任务可能都会进入到队列里面。此时队列是无界的,表示说我这个队列其实可以存很多的任务,就会造成占用很多的内存,从而导致jvm可能出现oom。

SingleThreadExecute

同样的道理,当我们在调用这种 SingleThreadExecute 的时候,也是这样的。它只有一个线程,然后它里面也是用的这种无界的阻塞队列。

总结一下,就是我们在用Executors方法去创建线程池的时候,很有可能会造成oom。除开这个原因,由于我们没有自己去定义构造方法的参数,所以说我们想对于这些线程池再去进行一些监控、管理的时候,就会发现不太方便。在我们在工作中,建议大家自己要用构造方法来定义线程池,这样你可以更加灵活的控制,或者说去自定义线程的名字,这样也有利于大家去排查问题。

标签: #线程池有什么缺点