如果有数千个/动态数量的任务,如何使用Executor?

时间:2016-11-06 17:56:18

标签: java multithreading threadpoolexecutor executor

我刚刚发现了Java的执行官,并且我在想它是否符合我的需求。我有一个数据库,不断添加任务。

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

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

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

    如何根据我的情况进行调整?我不能只实例化10万个MyTask,它会浪费大量的内存。

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

1 个答案:

答案 0 :(得分:2)

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

Github链接上提供的实现,而一个好的起点也需要进行一些更改

  1. 如果您想要访问任务的返回值,请执行 确保您的任务实现了Callable interface Runnable
  2. 使用ExecutorService代替Executor会更多 有益,因为它有助于我们揭示更细粒度的关闭 功能。
  3. 公开一组允许执行程序关闭的方法 干净。这些关闭调用实现可以简单地委托给 基础ExecutorService.shutdown()ExecutorService.shutdownNow()基于要求。
  4. 最好将绑定作为配置参数保留 - 这样当初始化有界执行程序时,可以从此配置参数中读取可并行安全执行的任务数。

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

    希望这有帮助。