根据Java中的条件动态添加执行程序

时间:2019-02-04 19:33:39

标签: java multithreading executorservice executor

如果StrTemp.equals(true),我需要以下代码(我这里有2个线程):

ExecutorService executor = Executors.newFixedThreadPool(2);

Future<String> f1 = executor.submit(new Callable<String >() {
    public String  call() throws Exception {
        return dao.getS4PricingResponse(pricingRequestTemp);
    }
});
Future<String> f2 = executor.submit(new Callable<String>() {
    public String call() throws Exception {
        return dao.getS4ProductResponse(productRequestTemp);
    }
});

如果不是真的,我想创建三个线程。我将再添加一个f3=executor.submit。如何动态决定并提高效率?

1 个答案:

答案 0 :(得分:2)

您正在混淆两个不属于一起的东西。

  • 执行程序服务及其任务:该服务不知道或不关心要运行任务的线程数。换句话说:只需将工作项提交到其中即可。
  • 但是您必须预先“修复”线程数,简单的解决方案看起来会

像这样:

int numThreads = (whateverStrTemp.equals(somethingElse)) ? 2 : 3;
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
// now submit all the tasks you want to submit ...

关于评论:那是不容易做到的。方法调用在两个方面有所不同:被调用的方法和传递的参数!您可以将用于不同调用的lambda放入映射中,但是您可能需要另一个映射,该映射包含一个lambda来获取参数以传递给第一个lambda。从这种角度来看,我没有看到一种合理的方法来重构 this 代码。

我会退后一步,看看您尝试解决的根本问题,并研究以不同方式进行设计的方法,以获得更好的解决方案。

除此之外,您可以将所有代码放入一个循环中,并将期货添加到List<Future<String>>中,而不用创建变量f1,f2,...(提示:每当您开始使用foo1之类的名称时, foo2,...您应立即停止并使用数组或列表。)