我遇到这种情况:
@RestController
@RequestMapping("/api")
public class A {
@Autowired
private B b;
@RequestMapping(value = "/exec", method = RequestMethod.GET)
public void execute(){
int i = 0;
for (i; i < 10; i++;){
b.execute(i);
}
}
@RequestMapping(value = "/exec/{i}", method = RequestMethod.GET)
public void executeSingle(@PathVariable int i) {
b.execute(i);
}
}
@Service
public class B{
public void execute(int i){
//...a long time...
}
}
现在我调用A的方法execute()并且它需要很长时间,因为它连续调用B.execute()。
我想采用并行方法。
我会创建bean B的多个实例并同时调用它们,因此我可以获得大约9/10的时间用于实际的&#34;循环解决方案&#34;。
我该怎么做?
现在为了获得这些改进,我通过具有多个HTTP GET的浏览器调用了10次A的方法executeSingle(int i):
GET ADDRESS / api / exec / 1
获取地址/ api / exec / 2
GET ADDRESS / api / exec / 3
...
但我想使用更优雅的解决方案。
答案 0 :(得分:1)
我想说你需要使用ExecutorService,特别是ThreadPoolExecutor阅读它们以了解如何使用它。然后我会对您的代码进行以下更改:更改您的B类以实现Runnable。
public class B implements Runnable {
private int myParam;
public void setMyParam(int i) {
myParam = i;
}
public void run() {
execute(myParam)
}
private void execute(int i) {
...
}
}
现在不要把它变成豆子,不要把它注入你的A级。但是创建一个BclassFactory类来创建并返回一个B类(或者只是在每次需要时创建一个新的B类。现在将一个ThreadPoolExecutor实例注入你的A类,并在你的execute方法中执行类似这样的操作:
@RequestMapping(value = "/exec", method = RequestMethod.GET)
public void execute(){
int i = 0;
for (i; i < 10; i++;){
B b = factory.getB();
b.setMyParameter(i);
executor.submit(b);
}
}
应该做的伎俩