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

标签 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。我怎样才能动态地决定这一点并使其更有效率?

最佳答案

你混淆了两种不属于一起的东西。

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

像这样:

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 的参数。从这个角度来看,我没有看到一个合理的方法来重构这个代码。

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

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

关于java - java中根据条件动态添加执行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54523115/

相关文章:

java - 可以将多种语言组合成一个二进制文件吗?

java - 连接池的事务控制

java - 在awaitConfimation之后关闭Executor线程

c++ - Windows OS的I/O优先级

java,为什么 thread.wait() 在我的代码中不起作用

java - Runnable 的线程在执行后不会被销毁

java - 如果我停止正在运行的 java 项目,ExecutorService 会发生什么情况

java - 关于Hash Set中的contains方法的问题

UTC和祖鲁时间的Java 8相等?

java - ProGuard:库类的重复定义?