1

したがって、次のコードでは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");
    }
}

}

4

1 に答える 1

1

最良のオプションは、 ExecutorService を使用してinvokeAll()を呼び出すことです。Executors.newFixedThreadPool()を呼び出してインスタンスを取得できます。

于 2013-04-05T07:55:53.487 に答える