gpt4 book ai didi

Java 信号量 availablePermits with ThreadPool

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:15 25 4
gpt4 key购买 nike

我正在使用教程 https://www.baeldung.com/java-semaphore 在 Java 中学习信号量.

教程中的第一个测试(低于一个)运行良好。

@Test
public void givenLoginQueue_whenReachLimit_thenBlocked() {
    int slots = 10;
    ExecutorService executorService = Executors.newFixedThreadPool(slots);
    LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots);
    IntStream.range(0, slots)
      .forEach(user -> executorService.execute(loginQueue::tryLogin));
    executorService.shutdown();
 
    assertEquals(0, loginQueue.availableSlots());
    assertFalse(loginQueue.tryLogin());
}

如果我在上面的测试用例片段中注释 executorService.shutdown(); 行,那么测试将失败并出现以下错误。

java.lang.AssertionError: 
Expected :0
Actual :1
<Click to see difference>
at org.testng.AssertJUnit.fail(AssertJUnit.java:59)
at org.testng.AssertJUnit.failNotEquals(AssertJUnit.java:364)
at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:80)
at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:245)
at org.testng.AssertJUnit.assertEquals(AssertJUnit.java:252)
at LoginQueueSemaphoreTest.givenLoginQueue_whenReachLimit_thenBlocked(LoginQueueSemaphoreTest.java:24)

一旦我删除评论并启用 executorService.shutdown(); 测试就可以正常工作。

我无法理解 test(Semaphore available permits) 如何依赖于外部线程池。另外,当我没有释放任何许可证时,1 个插槽如何可用?任何简短的解释都会有所帮助。提前致谢。

最佳答案

这是一致的行为,还是您有时会得到不同的 Actual 值(当省略 executorService.shutdown() 调用时)?如果您偶尔看到其他值(比如 2 或 3),这强烈表明这完全是由于日程安排/时间安排造成的。

尝试用 Thread.sleep(15_000) 替换 executorService.shutdown()。如果您进行此更改,测试是否通过?如果是,那么这表明发生的情况是执行 shutdown() 调用所花费的额外时间刚好足以确保可以生成 10 个线程并执行它们的工作(调用tryLogin() 递减 Semaphore) before assertEquals() 调用被执行。请注意,根据 documentation , shutdown() 启动 ExecutorService 的有序关闭,因为它允许执行任务运行完成,但调用本身 在此期间阻止。因此,执行 shutdown() 所需的时间恰好足以让其他线程终止,这似乎纯属偶然。因此,这不是一个很好的测试,因为该行为可能因不同的机器而异。相反,测试应该调用 shutdown() 后跟 awaitTermination()(或者使用递减的 CountDownLatch由工作人员阻塞主线程)以确保 assertEquals() 调用在所有工作线程终止之后之前不执行。

关于Java 信号量 availablePermits with ThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52108534/

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