我刚刚了解了Java的Executor,我在想它是否符合我的需求。我有一个数据库,不断向其中添加任务。
I SQL 从数据库中选择所有行(任务)。在任何时候,都可能有 100000 个、200 个、3 个或 0 个。
我看到所有的例子都是这样的:
ExecutorService taskExecutor = Executors.newFixedThreadPool(50); while(...) { taskExecutor.execute(new MyTask()); }
如何调整它以适应我的场景?我不能只实例化 100000 个 MyTask,这会浪费大量内存。
我应该如何等待完成并再次检查?我不能等到 100000 个任务完成,因为第一个任务可能会在 5 秒内完成,并且会在很长一段时间内保持不使用,直到最后一个任务完成,所以我们会浪费时间。
最佳答案
一种优雅且高效的方法是使用 BoundedExecutor
实现,如 Brian Goetz 所著的《Java Concurrency In Practice》(Github link here)一书中所示。
Github 链接上提供的实现虽然是一个好的起点,但还需要进行一些更改
- 如果您想访问任务的返回值,请执行
确保您的任务实现 Callable interface反而
可运行
。 - 使用 ExecutorService而不是
Executor
会更 有益的,因为它可以帮助我们暴露更细粒度的关闭 功能。 - 公开允许执行程序关闭的一组方法
干净地。这些关闭调用实现可以简单地委托(delegate)给
底层的 ExecutorService.shutdown() 或
ExecutorService.shutdownNow()
根据要求。
此外,最好将绑定(bind)保留为配置参数 - 这样,当初始化绑定(bind)执行器时,可以从此配置参数中读取可以安全并行执行的任务数量。
可以根据您的性能和规模测试调整此配置参数,以确定应用程序的最佳范围,而不会降低其性能或底层系统性能。
希望这有帮助。
关于java - 当有数千个/动态数量的任务时如何使用Executor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40452598/