在一段时间内使用JConsole监控我们的应用程序显示“实时线程”计数不断增加。增加线程数对我来说听起来不好,或者我错了?
梗概: 在我们的应用程序中,我们使用Executors.newFixedThreadPool,Executors.newSingleThreadScheduledExecutor为各种收集器创建线程池。这些收藏家每隔几分钟就会被召集一次。 并且在每次收集期间还有上述收藏家称之为n次的其他服务。此服务生成一个执行FutureTask的线程(Executors.newFixedThreadPool(1);)。对于上述所有ExecutorServices,只有在捕获到异常时才会调用shutdownNow(),剩下的就是GC。
1)我是否需要在流程完成后关闭执行程序,还是可以依赖GC?
感谢您的建议和见解 Ajju
答案 0 :(得分:1)
应该在执行者服务上明确地调用shutdown - executor.shutdown()以便有序关闭&资源回收(旧任务在不接受新任务时执行)。
shutdownNow()尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表(不保证执行任务 - 它们可能执行也可能不执行 - 这是最好的尝试。)
答案 1 :(得分:1)
线程池的目的是避免在处理过程中产生新线程的开销。你不应该产生新的线程池! (这是你在这里做的Executors.newFixedThreadPool(1);
)
您应该在应用程序启动时设置线程池,并将它们注入到处理对象中。