当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");
}
}
答案 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
}
}
}
如果您只是通过等待和相反的方式替换倒计时,您将获得与更改前相同的结果。