根据条件动态提交任务给ExecutorService

Dynamically submitting tasks to ExecutorService based on condition

我目前正在使用具有固定线程池的 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 等

这是否满足您的要求:

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

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

我认为您想要做的是抽象出您对 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);