You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CountDownLatch的await方法超时未抛出异常,运行结果不符合预期

问题原因分析
  • 你完全搞混了CountDownLatch.await(long timeout, TimeUnit unit)的触发规则:
    • 该方法抛出InterruptedException的唯一前提是当前等待线程(也就是主线程)在等待过程中被其他线程主动中断,和超时没有任何关系。
    • 超时场景下,该方法只会返回布尔值false,不会抛出异常。如果在超时时间内计数器归零,则返回true。
  • 你的代码没有判断await方法的返回值,所以不管是否超时,只要主线程没被中断,都会执行后面打印「All four players joined. game started」的逻辑,这是核心错误。
  • 你看到的玩家先打印加入信息的现象是符合代码逻辑的:Players类的run方法执行顺序是先打印加入信息,再执行Thread.sleep,最后才调用countDown。四个子线程被线程池启动后会立刻执行打印逻辑,不需要等sleep结束,所以1秒的等待时间足够四个子线程打印完加入信息。
修正方案

你只需要根据await的返回值判断后续逻辑即可,示例如下:

try {
    boolean allReady = latch.await(1000, TimeUnit.MILLISECONDS);
    if (allReady) {
        System.out.println("All four players joined. game started ");
    } else {
        System.out.println("cant start the game ");
    }
} catch (InterruptedException e) {
    // 只有主线程被中断时才会走到这里,比如其他线程调用了mainThread.interrupt()
    System.out.println("game interrupted ");
}

内容的提问来源于stack exchange,提问作者akt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:45:03