我目前正在使用具有固定线程池的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等。
答案 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}}包含您要运行的服务,具体取决于您的应用程序逻辑。