gpt4 book ai didi

java - 当有数千个/动态数量的任务时如何使用Executor?

转载 作者:行者123 更新时间:2023-12-02 03:15:03 25 4
gpt4 key购买 nike

我刚刚了解了Java的Executor,我在想它是否符合我的需求。我有一个数据库,不断向其中添加任务。

  1. I SQL 从数据库中选择所有行(任务)。在任何时候,都可能有 100000 个、200 个、3 个或 0 个。

  2. 我看到所有的例子都是这样的:

    ExecutorService taskExecutor = Executors.newFixedThreadPool(50);
    while(...) {
    taskExecutor.execute(new MyTask());
    }

    如何调整它以适应我的场景?我不能只实例化 100000 个 MyTask,这会浪费大量内存。

  3. 我应该如何等待完成并再次检查?我不能等到 100000 个任务完成,因为第一个任务可能会在 5 秒内完成,并且会在很长一段时间内保持不使用,直到最后一个任务完成,所以我们会浪费时间。

最佳答案

一种优雅且高效的方法是使用 BoundedExecutor 实现,如 Brian Goetz 所著的《Java Concurrency In Practice》(Github link here)一书中所示。

Github 链接上提供的实现虽然是一个好的起点,但还需要进行一些更改

  1. 如果您想访问任务的返回值,请执行确保您的任务实现 Callable interface反而可运行
  2. 使用 ExecutorService而不是 Executor 会更有益的,因为它可以帮助我们暴露更细粒度的关闭功能。
  3. 公开允许执行程序关闭的一组方法干净地。这些关闭调用实现可以简单地委托(delegate)给底层的 ExecutorService.shutdown() 或ExecutorService.shutdownNow() 根据要求。

此外,最好将绑定(bind)保留为配置参数 - 这样,当初始化绑定(bind)执行器时,可以从此配置参数中读取可以安全并行执行的任务数量。

可以根据您的性能和规模测试调整此配置参数,以确定应用程序的最佳范围,而不会降低其性能或底层系统性能。

希望这有帮助。

关于java - 当有数千个/动态数量的任务时如何使用Executor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40452598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com