java - ExecutorService.execute() 静默退出 run() 方法
问题描述
试图测试我的一个类是否可以处理在多个线程上被访问。我有一个 JUnit 测试,我在其中创建了一个类来实现Runnable
和运行我的类。
当我运行执行时,它到达 run() 方法中的一行,然后在该线程上退出而没有报告任何问题,我用 Try-Catch(Throwable) 包装了它,但仍然没有迹象表明出了什么问题。
这是我的代码:
class ConcurrencyTests {
class ConcurrentComponentTracker implements Runnable {
private String component;
ConcurrentComponentTracker(String component) {
this.component = component;
}
@Override
public void run() {
try {
System.out.printf("Component to track: [%s]\n", component);
ParserHandler parserHandler = new ParserHandler();
System.out.println(parserHandler.componentTracker(component));
}
catch (Throwable t) {
t.printStackTrace();
}
}
}
@Test
void runRunner() {
ExecutorService executor = Executors.newFixedThreadPool(4);
String[] componentsToTrack = {"x", "y", "z"};
executor.execute(new ConcurrentComponentTracker(componentsToTrack[0]));
executor.execute(new ConcurrentComponentTracker(componentsToTrack[1]));
executor.execute(new ConcurrentComponentTracker(componentsToTrack[2]));
}
}
和输出:
Component to track: [x]
Component to track: [y]
Component to track: [z]
它似乎只是在 ParserHandler 实例化行上退出而没有报告任何内容。当尝试调试并进入该行时,它只是跳到最后,而不让我检查 ParserHandler 类实例化。
解决方案
谁在评论中回答然后删除它为我解决了这个问题。我的主 JUnit 线程没有等待其他线程完成。所以我将这些行添加到最后,它按预期工作:
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
}
catch (InterruptedException e) {
e.printStackTrace();
}
推荐阅读
- ios - 表达式类型 '(Bool, Error?) -> Void' 在没有更多上下文的情况下是模棱两可的
- python - 使用 Python Regex 提取代码的非注释部分
- kotlin - 为什么 inc() 不能定义为与接收者类型不同的类中的扩展函数?
- python-3.x - 如何将 PyQt QProcess 窗口置于前面?
- python - 删除 Pandas 数据框中未使用的类别
- java - 在 Java GUI 中禁用组件而不将其变灰
- visual-c++ - 如何从 _LOADED_IMAGE 结构访问所有 PE 节标题?
- file - 如何使用批处理文件从需要登录用户名/密码的网站下载?
- c - 如何在套接字连接中接收 tcp 标志
- c# - EF Core 不保存 ParentId