根据 java 中的条件动态添加执行程序
Add executors dynamically based on a condition in java
如果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
。我怎样才能动态地决定这一点并使其更有效率?
你混淆了两个不属于一起的东西。
- 执行器服务及其任务:该服务不知道或不关心 运行 任务将有多少线程。换句话说:只需将您的工作项目提交到其中即可。
- 但你必须预先 "fix" 线程数,简单的解决方案看起来
像这样:
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 的参数。从这个角度来看,我看不到重构 这个 代码的合理方法。
我会退后一步,看看您试图解决的根本问题,并研究不同的设计方法,以获得更好的解决方案。
除此之外,您可以将所有代码放入一个循环中,并将未来添加到 List<Future<String>>
而不是创建变量 f1、f2、...(提示:每当您开始使用诸如foo1, foo2, ... 你应该立即停止并使用数组或列表)。
如果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
。我怎样才能动态地决定这一点并使其更有效率?
你混淆了两个不属于一起的东西。
- 执行器服务及其任务:该服务不知道或不关心 运行 任务将有多少线程。换句话说:只需将您的工作项目提交到其中即可。
- 但你必须预先 "fix" 线程数,简单的解决方案看起来
像这样:
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 的参数。从这个角度来看,我看不到重构 这个 代码的合理方法。
我会退后一步,看看您试图解决的根本问题,并研究不同的设计方法,以获得更好的解决方案。
除此之外,您可以将所有代码放入一个循环中,并将未来添加到 List<Future<String>>
而不是创建变量 f1、f2、...(提示:每当您开始使用诸如foo1, foo2, ... 你应该立即停止并使用数组或列表)。