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

标签 java multithreading threadpoolexecutor executor

我刚刚了解了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/

相关文章:

java - 如何实现阻塞ThreadPoolExecutor

java - IF EXISTS 语句的语法 SQL 错误

java - 如何在java中创建列表数组

java - 数组和读写文本文件问题 - Java

c# - Quit() 使 Access 暂时可见

asp.net - 我应该将工作卸载到 ASP.NET 中的其他线程吗?

java - 无论如何要通过 JVMTI 获得 jthread tid?

java - 为什么总是 threadPoolExecutor.getActiveCount() <= MaximumPoolSize/2?

java - 在 ThreadPoolExecutor 中测试 PriorityBlockingQueue

java - Android 键盘分辨率