Java Spring bean,它创建了另一个bean的更多实例

时间:2017-11-08 16:35:22

标签: java spring multithreading spring-mvc

我遇到这种情况:

@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

...

但我想使用更优雅的解决方案。

1 个答案:

答案 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);
    }
}

应该做的伎俩