在弹簧控制器中产生新线程

时间:2013-04-05 04:30:20

标签: java multithreading servlets controller

因此,在下面的代码中,当我执行yService.performAction()时,它会为许多项目执行此操作,并且花费了太多时间。

我被建议尝试使用线程来加快速度,所以我上网查看并发现从控制器生成新的子线程是不可取的,因为它可能会弄乱Java EE容器线程池。如果我的yService.performAction()需要时间来运行并需要快速运行,我有哪些选择?

许多人一直建议使用Quartz来生成新线程。我不确定我是否想做一些复杂的事情。如何在单独的线程中运行该特定服务?有没有简单的方法呢?

@Controller
@RequestMapping("/test")
public class TestController {
private static final Logger logger = Logger.getLogger(TestController.class);

@Autowired
XService xService;
@Autowired
private YService yService;

@RequestMapping(method = { RequestMethod.GET })
public void testCheck(HttpServletRequest request, HttpServletResponse response) throws IOException {

    try {
        List<SL> somelist = XService.getAllX();

        StringBuffer status = new StringBuffer("SUCCESS\n\n");

        for (SL sl : somelist) {
            boolean flag = false;
            try {
                flag = yService.performAction(sl);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }

        }

        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().write(status.toString());

    } catch (Exception e) {
        logger.error(e.getMessage(), e);
        response.getWriter().write("FAILED");
    }
}

}

1 个答案:

答案 0 :(得分:0)

您最好的选择是使用ExecutorService并致电invokeAll()。您可以通过调用Executors.newFixedThreadPool()来检索实例。