根据条件动态提交任务给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);
然后只需确保名为 servicesToRun
的 List
包含您想要 运行 的服务即可,具体取决于您的应用程序逻辑。
我认为您想要做的是抽象出您对 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);
我目前正在使用具有固定线程池的 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);
然后只需确保名为 servicesToRun
的 List
包含您想要 运行 的服务即可,具体取决于您的应用程序逻辑。
我认为您想要做的是抽象出您对 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);