在这段代码中,我使用两个线程来处理两个任务。任务完成后,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;
}
答案 0 :(得分:1)
请记住,实现任务业务逻辑的实际内容不是池化线程。从任务(Runnables或Callables)到执行它们的线程,状态没有流失。因此,没有理由丢弃完美的线程并获得新的线程。
当应用程序关闭时,是关闭线程池的好地方。 Web应用程序允许您在contextDestroyed方法中注册ServletContextListener,您可以在其中实现此类事物。