在循环中启动和关闭线程是否合适?

时间:2018-05-19 23:57:57

标签: java executorservice

在这段代码中,我使用两个线程来处理两个任务。任务完成后,ExecutorService将关闭。然后它继续处理下一对'sku'& '输入文本'。再次创建两个线程来处理这两个任务,并关闭。它继续这种方式,直到处理完所有输入。

这是在本地方法中使用多个线程的常规方法吗?我担心在方法中经常创建和关闭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;
}

1 个答案:

答案 0 :(得分:1)

请记住,实现任务业务逻辑的实际内容不是池化线程。从任务(Runnables或Callables)到执行它们的线程,状态没有流失。因此,没有理由丢弃完美的线程并获得新的线程。

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