创建另一个bean的更多实例的JavaSpringbean

创建另一个bean的更多实例的JavaSpringbean,java,spring,multithreading,spring-mvc,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++;){

我有这样的情况:

@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

我该怎么做

现在,为了获得这些改进,我通过具有多个HTTP get like的浏览器调用了A的方法ExecuteSingelInt I 10次:

获取地址/api/exec/1

获取地址/api/exec/2

获取地址/api/exec/3


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

我想说,您需要使用,尤其是阅读有关它们的内容,以了解如何使用它。然后我将对代码做以下更改:更改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) {
      ...
    }
  }
现在不要把它变成一个bean,也不要把它注入到你的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);
    }
}

这应该可以做到

发布代码,在其中并行调用所有B实例,您如何使用ServiceExecutor,使用您自己的线程来实现这一点??每次调用rest服务时,都会使用一个Http线程来处理请求,如果使用睡眠,则每个Http线程都需要相同的时间。所以这是容器的自然多线程。如果您想要其他类型的多线程处理,您需要在某个地方提交b.execute任务,在Executor服务中或在其他地方。另一种可能是使用AsyncServlets来减少Http线程池的使用请进一步解释一下您想要做什么achieve@karelss我编辑我的问题:在我写之前,我会有一个平行的。。。相反,我希望有一个并行的…,所以我没有任何关于并行方法的代码。根据问题末尾所述的方法,我使用容器多标题,通过浏览器或邮递员发出更多HTTP GET请求。。。但是我只想发出一个HTTP GET请求并自己处理多线程。我想在A的execute方法中创建一些线程或创建更多的B实例,但我不知道更好的方法是什么。好的,当我在评论中发布时,你应该使用executerservice@Michael Gantman发布一个如何使用它的示例,使用executor服务,您可以提交任务,执行者处理任务的并发执行,您可以接收Future来检查流程的状态或与之交互,检索结果,只需调用Future yourFuture=……;即可。。。。。。。。。。。。。;;yourfuture.getHanks寻求帮助,但是我不能让B类a没有SpringBean类,因为它与其他SpringBean交互!您如何看待nt@Async注释?您的B类与其他Springbean交互的事实并不妨碍您使B类成为非Springbean类。你现在有了这个类的工厂,每次你需要它的时候就从你的工厂得到一个实例。是的!!!我不知道我可以将托管spring类注入到非托管spring类中。有了你的解决方案,我实现了我的目标!谢谢太好了,我很高兴能帮助你。我看到你把我的答案标为解决问题的答案。请你把答案也投上一票,好让其他人觉得更容易些吗?