在循环中启动和关闭线程好吗?

Is it good to start and shutdown threads in a loop?

在这段代码中,我使用两个线程来处理两个任务。任务完成后,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;
}

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

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