为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2022-06-04 17:45:47
如果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 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

你把两个不属于一起的东西混在一起了。


执行器服务及其任务:该服务不知道也不关心有多少线程来运行任务。换句话说:只需将您的工作项提交到其中。

但是您必须预先“修复”线程数,简单的解决方案看起来

像这样:


int numThreads = (whateverStrTemp.equals(somethingElse)) ? 2 : 3;

ExecutorService executor = Executors.newFixedThreadPool(numThreads);

// now submit all the tasks you want to submit ...

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


我会退后一步,看看你试图解决的潜在问题,并寻找不同的设计方法,以获得更好的解决方案。


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


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信