3 votes

Java CountDownLatch ne se débloque pas ? Pourquoi la dernière ligne ne s'imprime pas ?

Le countDownLatch ne sera pas attendu après countDown() jusqu'à zéro. mais le programme est verrouillé . la dernière impression n'est jamais sortie.

public static void main(String[] args) throws Exception{
    CountDownLatch countDownLatch = new CountDownLatch(1);
    countDownLatch.await();

    new Thread(new Runnable() {
        @Override
        public void run() {
            countDownLatch.countDown();
            countDownLatch.countDown();
        }
    }).start();

    System.out.println("------should print-------");
}

si la méthode await est dans un thread (pas le thread principal), cela fonctionne. pourquoi ?

public static void main(String[] args) throws Exception {
    CountDownLatch countDownLatch = new CountDownLatch(1);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            countDownLatch.countDown();
            countDownLatch.countDown();
        }
    }).start();

    System.out.println("------should print-------");
}

6voto

xoxel Points 904

Vous appelez await (et arrêtez le thread) avant de lancer votre sub-Thread :

public static void main(String[] args) throws Exception{
    CountDownLatch countDownLatch = new CountDownLatch(1);

    new Thread(new Runnable() {
        @Override
        public void run() {
            countDownLatch.countDown();
            countDownLatch.countDown();
        }
    }).start();
    countDownLatch.await();
    System.out.println("------should print-------");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X