根据条件动态地将任务提交到ExecutorService

时间:2016-09-14 22:22:13

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

我目前正在使用具有固定线程池的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或它们或它们的任何组合。

如何自定义我想要提交的所有服务以用于exectution和线程池大小?

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

2 个答案:

答案 0 :(得分: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 :(得分:0)

这是否满足您的要求:

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

然后,只需确保名为List的{​​{1}}包含您要运行的服务,具体取决于您的应用程序逻辑。