3 回答
TA贡献1821条经验 获得超4个赞
我想知道这是否是常见行为,或者在某些时候存在内存泄漏并且会爆炸。它不应该重用以前的池吗?
好吧,您一直在显式创建新池。
// this creates a new pool final ExecutorService threads = Executors.newFixedThreadPool(col.size());
至于内存泄漏,因为您要关闭池,所以应该没问题(但是为了finally
安全起见,以防万一)。
如果你想重新使用池(这很有意义),你应该为threads
你创建一个实例变量Processor
(并确保在关闭方法中Processor implements AutoCloseable
关闭它)。threads
TA贡献1842条经验 获得超12个赞
您正在调用Executors.newFixedThreadPool()您的函数,它创建了一个新的线程池。
这本身并没有错,但并不常见,并且与使用线程池背后的许多动机背道而驰。一种更标准的方法是在您的Processor类中创建一个线程池,并将作业分配给它,如下所示:
class Processor {
private final ExecutorService service = Executors.newFixedThreadExecutor(count);
private void doStuff() {
...
...
service.submit(() -> w.process());
}
}
TA贡献1725条经验 获得超7个赞
拥有线程池的想法是限制您正在创建的线程数量并重用已经创建的线程,以避免在给定时间不必要地拥塞处理大量线程并提高效率。现在您的代码的问题是它既不限制线程数也不重用。由于您只进行一些打印,因此您可能看不到拥塞,但如果您在 worker 中添加更多处理并继续并行调用它,那么您将看到完成处理的严重延迟。
添加回答
举报