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
相关产品推荐
相关产品推荐

