java - 循环启动和关闭线程好吗?
问题描述
在这段代码中,我使用两个线程来处理两个任务。任务完成后,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 ,您可以在其中实现这种事情。
推荐阅读
- python - Matplotlib - 如何使用文档找到特定需求?
- c++ - 使用 HLSL 进行帧旋转
- mysql - Mysql Foreach 从一个表到另一个表第 2 部分
- spring-boot - JPA 的 deleteAll 在表中留下一个条目。我怎样才能清楚地删除所有条目?
- node.js - 机器人框架 continueDialog 没有弹出堆栈
- ios - Xcode 更新后如何修复 Core NFC 框架的无效授权
- youtube - 为什么 Google 不为其产品(如 google.com、youtube.com)使用 PWA 功能
- javascript - 使用对象过滤对象数组驻留在嵌套数组属性中
- asp.net-core - 升级到 ASP.NET Core 3.0 后,我得到“无法创建 stdoutLogFile 错误代码 = -2147024893”。
- powerbi - 是否有一个公式可以自动将数据从多列拖到新列中?