java - CountDownLatch等待方法问题: doesn't throw on timeout

标签 java multithreading countdownlatch

我正在编写一个简单的程序来演示CountDownLatch。这是我的程序:

class Players implements Runnable {
    private int delay;
    private String name;
    private CountDownLatch latch;

    Players(int delay, String name, CountDownLatch latch) {
        this.delay = delay;
        this.name = name;
        this.latch = latch;
    }

    @Override
    public void run() {
        System.out.println("Player" + name + "joined");
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        latch.countDown();
    }
}
public class LudoDemoUsingCountDownLatch {
    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(4);
        ExecutorService service = Executors.newFixedThreadPool(4);
        service.execute(new Players(11000, "player-1", latch));
        service.execute(new Players(12000, "player-2", latch));
        service.execute(new Players(13000, "player-3", latch));
        service.execute(new Players(14000, "player-4", latch));
        try {
            latch.await(1000, TimeUnit.MILLISECONDS);
            System.out.println("All four playesr joined. game started ");
        } catch (InterruptedException e) {
            System.out.println("cant start the game ");
        }
    }
}

我期望主线程应该在任何玩家加入之前启动,并且 catch block 内的代码应该执行,因为等待方法的等待时间小于所有玩家线程的 sleep 方法。但我没有得到那个输出。相反,它显示所有玩家都加入并且游戏已经开始:

输出:

 1. Player-2joined
 2. Player-3joined
 3. Player-1joined
 4. Player-4joined
 5. All four players joined. game started 

最佳答案

您需要检查CountDownLatch.await的返回值。超时时不会抛出InterruptedException;它返回false

因此,main 方法的更正版本将如下所示:

CountDownLatch latch = new CountDownLatch(4);
ExecutorService service = Executors.newFixedThreadPool(4);
service.execute(new Players(11000, "player-1", latch));
service.execute(new Players(12000, "player-2", latch));
service.execute(new Players(13000, "player-3", latch));
service.execute(new Players(14000, "player-4", latch));
boolean started = false;
try {
    started = latch.await(1000, TimeUnit.MILLISECONDS);
    if (started) {
        System.out.println("All four players joined. game started ");
    }
} catch (InterruptedException e) {
    System.out.println("Interrupted - won't generally be hit");
}
if (!started) {
    System.out.println("Can't start the game");
}

请注意,您可能打算将System.out.println("Player"+ name + "joined"); 放在之后Player 中的 Thread.sleep 调用。

关于java - CountDownLatch等待方法问题: doesn't throw on timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68842160/

相关文章:

java - 尝试从 URL 加载可绘制图像时出现异常

java - 从java启动mysql服务器

c++ - 来自另一个线程的线程中断

c - 如何关闭文件?

java - Android后台服务定时器无法正常工作

java - Log4j 记录到 log4j.log 而不是指定的文件名

c++ - 为什么std::lock_guard在使用std::adopt_lock之后释放锁?

java - 如果多个线程调用CountDownLatch的await()方法会发生什么?

java - Java 中的 CountDownLatch 需要额外的同步吗?

java并发: lightweight nonblocking semaphore?