【发布时间】:2022-01-11 07:12:24
【问题描述】:
我想同时运行 20 个线程来测试我的 id 生成器。但是, uniqueSet.add(id) 不会将 id 添加到集合中。当我断言时,它说集合大小为零。
@Test
void should_generate_unique_id_concurrently() throws InterruptedException {
Set<Long> uniqueSet = ConcurrentHashMap.newKeySet();
final int numberOfThreads = 20;
ExecutorService service = Executors.newFixedThreadPool(numberOfThreads);
CountDownLatch latch = new CountDownLatch(numberOfThreads);
for (int i = 0; i < numberOfThreads; i++) {
service.submit(() -> {
try {
latch.countDown();
latch.await();
long id = idGenerator.nextId();
uniqueSet.add(id);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
assertEquals(numberOfThreads, uniqueSet.size());
}
【问题讨论】:
-
不确定这是否能解决问题,但测试至少应该等到所有提交的任务都已执行。这涉及收集由
service.submt(...)返回的所有Future<?>s,然后是get()ting 所有这些Future<?>s 的值。 -
@Turing85 不需要期货。
service.shutdown后跟service.awaitTermination将完成同样的事情。 -
@VGR 是的,这在这种特殊情况下也有效。
标签: java multithreading junit concurrency