根据java中的条件动态添加执行器

1yjd4xko  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(324)

如果 StrTemp.equals(true) ,我希望代码如下(我这里有两个线程):

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 . 我如何动态地决定这一点并使其更有效?

rryofs0p

rryofs0p1#

你把两件不属于一起的东西混在一起了。
executor服务及其任务:该服务不知道或不关心将有多少线程来运行任务。换句话说:只需将您的工作项提交到其中。
但是您必须预先“修复”线程的数量,简单的解决方案如下所示
这样地:

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

关于评论:这是不容易做到的。方法调用在两个方面不同:被调用的方法和被传递的参数!您可以将不同调用的lambda放入一个Map中,但是您可能需要另一个Map来保存lambda,该lambda获取要传递给第一个lambda的参数。从这个Angular 来看,我认为仅仅重构这段代码是不合理的。
我会退后一步,看看你试图解决的根本问题,研究不同的设计方法,找到更好的解决方案。
除此之外,您还可以将所有代码放入单个循环,并将未来添加到 List<Future<String>> 而不是创建变量f1,f2(提示:每当你开始使用像foo1,foo2这样的名字时。。。您应该立即停止并使用数组或列表)。

相关问题