尝试测试我的一个类是否可以处理在多个线程上的访问。我有一个 JUnit 测试,其中创建了一个类来实现 Runnable 并运行我的类。
当我运行execute时,它到达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]));
}
}
输出:
要跟踪的组件:[x]
要跟踪的组件:[y]
要跟踪的组件:[z]
它似乎只是在 ParserHandler 实例化行退出而不报告任何内容。当尝试调试并单步执行该行时,它只是跳到最后,而不让我检查 ParserHandler 类实例化。
最佳答案
无论是谁在评论中回答然后删除它都为我解决了问题。我的主 JUnit 线程没有等待其他线程完成。因此,我将这些行添加到最后,它按预期工作:
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
}
catch (InterruptedException e) {
e.printStackTrace();
}
关于java - ExecutorService.execute() 静默退出 run() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722946/