【发布时间】:2019-12-14 13:06:56
【问题描述】:
此方法的规范:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool()
创建一个线程池,根据需要创建新线程,但在可用时将重用以前构造的线程。这些池通常会提高执行许多短期异步任务的程序的性能。如果可用,对执行的调用将重用以前构造的线程。如果没有可用的现有线程,将创建一个新线程并将其添加到池中。六十秒内未使用的线程将被终止并从缓存中删除。因此,保持空闲足够长时间的池不会消耗任何资源。请注意,可以使用 ThreadPoolExecutor 构造函数创建具有相似属性但细节不同(例如超时参数)的池。
从这个描述中我不清楚 - 在一个程序中拥有多个这样的池是否安全?或者我是否可能会遇到一个池在多个线程上停滞并冻结其他池的情况?
【问题讨论】:
-
您为什么希望一个池冻结另一个池?除了线程饥饿(过度使用共享资源)之外,它们不会对彼此产生任何影响。
-
对这些东西不太熟悉,但我认为你提到的“其他”是我担心的。如果我为每个池指定固定数量的线程,那么我可以保证我不会用完线程,对吧?但是如果我使用这个缓存池,如果一个池将它们全部占用并卡在它们上面,我可能会用完其他池的线程吗?
-
您可以创建的线程数实际上并没有硬性限制。但是,当您创建更多它们时,它们的效率会降低。
-
此外,每个线程都有一个堆栈并使用内存(对于典型的 64 位 JVM,默认为 1MB),如果你
start()太多,你可能会得到一个 OOME。 -
Java 线程(大约 20 年)由本机线程支持;本机线程由操作系统管理。
标签: java multithreading concurrency threadpool