首页 > 解决方案 > 循环启动和关闭线程好吗?

问题描述

在这段代码中,我使用两个线程来处理两个任务。任务完成后,ExecutorService 关闭。然后它继续处理下一对“sku”和“inputText”。再次创建两个线程来处理这两个任务,然后关闭。它以这种方式继续下去,直到处理完所有输入。

这是在本地方法中使用多个线程的正常方法吗?恐怕在方法中频繁创建和关闭ExecutorService局部变量可能不好。

 // defined as an instance variable 
 ExecutorService executorService = Executors.newFixedThreadPool(2);


 public ExtractedInfo execute(String sku, String inputText){ 

 ExtractedInfo info = new ExtractedInfo();    

 Callable<List<Subgraph>> retrieveTask = () -> {
        return this.retrieveAllAttributesFromGraph(sku);
    };
    Callable<String> parseTask = () -> {
        return this.executeParser(sku, inputText);
    };

    Future<List<Subgraph>> retrieveService = executorService.submit(retrieveTask);
    Future<String> parseService = executorService.submit(parseTask);

    String inputLine = null;
    List<Subgraph> allAttributes = null;

    try {
        inputLine = parseService.get();
        allAttributes = retrieveService.get();
    }catch(ExecutionException ee){
        ee.printStackTrace();
    }catch (InterruptedException ie){
        ie.printStackTrace();
    }
    **executorService.shutdown();**

    info.setInputLine(inputLine);
    info.setAttributes(allAttributes);

    return info;
}

标签: javaexecutorservice

解决方案


请记住,实现任务业务逻辑的实际事物不是池化线程。从任务(Runnables 或 Callables)到执行它们的线程没有状态流血。所以没有理由放弃完美的线程并去获取新的线程。

当应用程序关闭时是关闭线程池的好地方。Web 应用程序允许您在 contextDestroyed 方法中注册一个 ServletContextListener ,您可以在其中实现这种事情。


推荐阅读