gpt4 book ai didi

java - JUnit 和并发 : inexplicable error

转载 作者:行者123 更新时间:2023-12-02 07:53:30 25 4
gpt4 key购买 nike

我在一些帖子中读到,使用 JUnit 测试并发并不理想,但我现在别无选择。我刚刚遇到了一个无法解释的异常。

我运行了一个测试,总结一下:

  • 我向执行者提交了 1000 个可运行文件
  • 每个可运行对象都会向列表中添加一个元素
  • 我等待执行程序终止
  • JUnit 告诉我列表只有 999 个元素
  • 可运行的 catch block 中没有打印任何异常

什么可能导致这种行为?

注意:我只是偶尔遇到异常。该代码有一些不相关的东西,但我把它留在那里,以防我错过了一些东西。 XXXQuery 是一个枚举。

public void testConcurrent() throws InterruptedException {
final int N_THREADS = 1000;
final XXXData xxxData = new AbstractXXXDataImpl();
final List<QueryResult> results = new ArrayList<>();
ExecutorService executor = Executors.newFixedThreadPool(N_THREADS);
for (int i = 0; i < N_THREADS; i++) {
final int j = i;
executor.submit(new Runnable() {

@Override
public void run() {
try {
results.add(xxxData.get(XXXQuery.values()[j % XXXQuery.values().length]));
} catch (Exception e) {
System.out.println(e);
}
}
});
}
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
assertEquals(N_THREADS, results.size());
}

最佳答案

您无法在多个线程中的 Runnable.run() 方法中添加结果 ArrayList,而不对其进行同步。

断言失败消息显示,尽管对 add() 进行了 N_THREADS 调用,但由于并发竞争,ArrayList 获得的条目较少条件。

我会使用最终数组而不是列表。像这样的东西:

final QueryResult[] results = new QueryResult[N_THREADS];
for (int i = 0; i < N_THREADS; i++) {
...
public void run() {
results[j] = data.get(Query.values()[j % Query.values().length]);
}

另外,我不太明白XXXQuery.values(),但我会将其拉入循环上方的变量中,除非它发生变化。

关于java - JUnit 和并发 : inexplicable error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9929509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com