【发布时间】:2015-10-17 11:40:57
【问题描述】:
我有一个服务,它调用数据库并对每个结果执行回调。
ExecutorService service = Executors.newFixedThreadPool(10);
service.exectute(runnable(segmentID, callback)); // database is segmented
可运行的是:
call database - collect all the rows for the segment keep in memory
perform callback(segment);
现在的问题是我得到了数据库返回的大量行,我的理解是执行程序服务将在线程空闲时调度线程 I/O。所以我进入了内存不足。
有没有什么办法可以限制一次只运行10个线程并且不进行executor服务调度?
出于某种原因,我必须将段的所有行保留在内存中。 我怎样才能通过这样做来防止OOM。 Executor 服务 newFixedThreadPool 解决方案吗?
如果我遗漏了什么,请告诉我。
谢谢
【问题讨论】:
-
一些未知代码做未知的事情会导致内存问题。很难帮上忙。发布您的代码。向我们展示您如何“调用数据库”。向我们展示回调的作用。
-
请假设我想在 runnable 中执行巨大的 IO 并将检索到的值保存在内存中。如果我说有 10 个线程在执行 IO,而其他线程处于空闲状态,我不会进入 OOM,但如果执行器服务在这 10 个正在执行 IO 时调度其他线程,那么我肯定会进入 OOM。
-
如果您将 10 个或更多任务提交给有 10 个可用线程的执行器,则这 10 个线程将并发执行。这就是重点。如果您只希望 2 个线程并行执行,则创建一个具有 2 个线程的执行器。但无论如何,如果任务完成后所有内容都保留在内存中,那么线程数不会改变任何内容。
标签: java multithreading concurrency executorservice