简化CountDownLatch在世界上并不起作用

时间:2017-12-01 08:54:51

标签: java multithreading

WHERE trip = respective_trip_as_int设置为1并且在每个线程中减少时,为什么3个线程可以运行Worker.run()

CountDownLatch

public class App {
    public static void main(String[] args){

        CountDownLatch latch = new CountDownLatch(1);

        Thread t1 = new Thread(new Worker(1, latch));
        Thread t2 = new Thread(new Worker(2, latch));
        Thread t3 = new Thread(new Worker(3, latch));

        t1.start();
        t2.start();
        t3.start();

        try {
            t1.join();
            t2.join();
            t3.join();
            latch.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("end");

    }

}

2 个答案:

答案 0 :(得分:2)

因为您没有正确使用CountDownLatch。

来自javadoc

  

COUNTDOWN()   减少锁存器的计数,如果计数达到零,则释放所有等待的线程。

你使用的是错误的方法!如果希望阻止这些线程,则必须使用await()。该方法应该用于锁存器上的 sync 。倒数......只是倒计时。

换句话说:你有三个线程试图倒计时。在所有三个线程完成后,您对await()的一次调用发生!从这个意义上讲:转回来,研究这个课程给你的API - 然后重新修改你的例子来做一些“有用的”。

答案 1 :(得分:0)

@GhostCat为您提供问题的技术方面。如果你使用等待,你仍然不同步任何东西。问题是你想要做的。如果你尝试编写代码来逐个执行worker运行方法,你应该像这样在同一个锁上同步run方法内的代码(或oyu可以使用一个许可的信号量):

Object lock = new Object();
Thread t1 = new Thread(new Worker(1, object));

public class Worker implements Runnable {

    int x;
    Object lock;

    public Worker(int x, Object lock) {
        this.x = x;
        this.lock = lock;
    }

    @Override
    public void run() {

        synchronized(lock){
           enter code here
        }

    }

}

如果您只是通过等待和相反的方式替换倒计时,您将获得与更改前相同的结果。