【问题标题】:Dynamically submitting tasks to ExecutorService based on condition根据条件动态提交任务给ExecutorService
【发布时间】:2016-09-14 22:22:13
【问题描述】:

我目前正在使用带有固定线程池的 ExecutorServices 并提交 3 个任务。

ExecutorService executorService = Executors.newFixedThreadPool(3);

Future<Object1> = executorService.submit(task1);

Future<Object2> = executorService.submit(task2);

Future<Object3> = executorService.submit(task3);

executorService.shutdown();

executorService.awaitTermination(10000, TimeUnit.MILLISECONDS)

现在这可以完美运行,因为我一直需要执行所有这些差异 3 服务,但现在我想自定义它。 例如,我可能只需要运行服务 1、服务 2、服务 3 或它们的任意组合或全部。

如何自定义要提交执行的所有服务和线程池大小?

我对做令人毛骨悚然的if 检查是否需要服务 1 等不感兴趣。

【问题讨论】:

    标签: java multithreading concurrency executorservice java.util.concurrent


    【解决方案1】:

    我认为您想要做的是抽象出您对ExecutorService 的访问权限,并传递您希望它动态处理的任务。

    请注意,我在这里不做任何性能保证或承诺;这是一个至少要按照以下思路思考的概念。

    前提是我确定每次都要拆线程池,可以动态设置线程池大小为传入的任务大小。

    public void executeTasks(Callable<?>... tasks) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(tasks.length);
        for(Callable<?> task : tasks) {
            executorService.submit(task);
        }
    
        executorService.shutdown();
        executorService.awaitTermination(10000, TimeUnit.MILLISECONDS);
    }
    

    如果你处理了InterruptedException,你可以这样调用它:

    obj.executeTaks(future1, future3);
    

    【讨论】:

    • 我喜欢这个主意,如果我们也可以提供订单,我正在考虑。让我们假设任务 1 和 2 的批号为“1”,然后任务 3 的批号为 2。数量较少的批次(例如 1)首先执行该批号的任务并行化。一旦该批号完成,然后是下一批的任务。这也可行吗?
    • @NoviceUser:如果您创建一个自定义方法,该方法允许您指定包含可调用和批号的工作订单列表,当然可以。基本上,你可以做任何你喜欢的事情,因为你已经抽象出了 ExecutorService 部分;您可以将您需要的内容传递给该方法,并让该方法自己关注那些其他繁琐的要求。
    【解决方案2】:

    这是否满足您的要求:

    List<Runnable> servicesToRun = new ArrayList<>();
    ExecutorService executorService = Executors.newFixedThreadPool(servicesToRun.size());
    servicesToRun.stream().forEach(executorService::submit);
    

    那么只需确保名为servicesToRunList 包含您要运行的服务,具体取决于您的应用程序逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2020-02-06
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多