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

标签 java executorservice

<分区>

在这段代码中,我使用两个线程来处理两个任务。任务完成后,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,您可以在其中实现此类操作。

关于java - 在循环中启动和关闭线程好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50430512/

相关文章:

java - 所有多边形都变成透明的,如何解决?

java - Riak 和 Java - com.fasterxml.jackson.core.JsonParseException : Unexpected character ('<' (code 60))

java - 按值对 map 进行排序,需要澄清

java - ExecutorService 的 ThreadPool 工作线程不会调用 Autowiring 的成员变量方法

java - 如何使用 XPath/XSLT fn :json-to-xml

java - 在java web服务中执行多个线程

java - ExecutorService hibernate 线程池中的所有线程

java - 如何让这段代码线程安全呢?

spring - 在同一上下文中支持多个线程池

java - 如何在java中使红黑树泛型