我刚刚发现了Java的执行官,并且我在想它是否符合我的需求。我有一个数据库,不断添加任务。
我从数据库中选择所有行(任务)。任何时候,可能有100000,200,3或0个。
我看到所有的例子都是这样的:
ExecutorService taskExecutor = Executors.newFixedThreadPool(50);
while(...) {
taskExecutor.execute(new MyTask());
}
如何根据我的情况进行调整?我不能只实例化10万个MyTask,它会浪费大量的内存。
我应该如何等待完成并再次检查?我不能等到100000个任务完成,因为第一个任务可能在5秒内结束并且很长时间没有使用,直到最后一个完成,所以我们将浪费时间。
答案 0 :(得分:2)
一种优雅而有效的方法是使用BoundedExecutor
实现,如Brian Goetz的书中Java Concurrency In Practice(Github link here)所示。
Github链接上提供的实现,而一个好的起点也需要进行一些更改
Runnable
。Executor
会更多
有益,因为它有助于我们揭示更细粒度的关闭
功能。ExecutorService.shutdown()
或
ExecutorService.shutdownNow()
基于要求。最好将绑定作为配置参数保留 - 这样当初始化有界执行程序时,可以从此配置参数中读取可并行安全执行的任务数。
可以根据您的性能和规模测试调整此配置参数,以确定应用程序的最佳界限,而不会降低其性能或基础系统性能。
希望这有帮助。