Java 对于下面的程序,当线程完成其工作时,';t主线程停止?
这个程序通过不同的线程打印交替的数字来工作,但是当所有0-9的数字都打印出来时,为什么这个程序不停止呢?我必须手动停止我的应用程序Java 对于下面的程序,当线程完成其工作时,';t主线程停止?,java,multithreading,Java,Multithreading,这个程序通过不同的线程打印交替的数字来工作,但是当所有0-9的数字都打印出来时,为什么这个程序不停止呢?我必须手动停止我的应用程序 public class EvenOddPrinter implements Runnable{ private AtomicInteger num = new AtomicInteger(0); private Object lock = new Object(); @Override public void run() { synchronized
public class EvenOddPrinter implements Runnable{
private AtomicInteger num = new AtomicInteger(0);
private Object lock = new Object();
@Override
public void run() {
synchronized (lock){
while (num.get()<10){
System.out.println(num.getAndAdd(1) + " - "+Thread.currentThread().getName());
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class Executor {
public static void main(String[] args) throws InterruptedException {
EvenOddPrinter eop = new EvenOddPrinter();
Thread t1 = new Thread(eop);
Thread t2 = new Thread(eop);
t1.start();
t2.start();
}
}
public类打印机实现可运行{
私有AtomicInteger num=新的AtomicInteger(0);
私有对象锁=新对象();
@凌驾
公开募捐{
已同步(锁定){
while(num.get()这是因为在最后一个线程中,在wait
notifyAll
处卡住的线程将通知所有等待的线程(如果有)并释放锁
while (num.get()<10){
// existing implementation
}
lock.notifyAll();
while(num.get()这是因为在最后一个线程中,在wait
处卡住notifyAll
将通知所有等待的线程(如果有)并释放锁
while (num.get()<10){
// existing implementation
}
lock.notifyAll();
while(num.get()当数字达到8时,第一个线程调用notify()并转到wait()。然后第二个线程调用数字9并调用notify()并转到wait()。然后,第一个线程无法按照条件中的指定进入循环,因此,它退出synchronized and块并完成,但第二个线程仍在等待。必须有一种机制,在其中一个线程退出synchronized块时立即通知all(),这正是我所做的
@Override
public void run() {
synchronized (lock){
while (num.get()<10){
System.out.println(num.getAndAdd(1) + " - "+Thread.currentThread().getName());
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notifyAll();
}
@覆盖
公开募捐{
已同步(锁定){
while(num.get()当数字达到8时,第一个线程调用notify()并转到wait()。然后第二个线程生成数字9并调用notify()并转到wait()。然后,第一个线程无法按照条件中的指定进入循环,因此,它退出synchronized and块并完成,但第二个线程仍在等待。必须有一种机制,在其中一个线程退出synchronized块时立即通知all(),这正是我所做的
@Override
public void run() {
synchronized (lock){
while (num.get()<10){
System.out.println(num.getAndAdd(1) + " - "+Thread.currentThread().getName());
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notifyAll();
}
@覆盖
公开募捐{
已同步(锁定){
while(num.get()第二个线程t2最后继续等待锁,而t1不再执行notify(),因为while条件变为false。您必须将lock.notify();语句放在while循环之外。第二个线程t2最后继续等待锁,而t1不执行notify()因为while条件变为false。您必须在while循环之外放置一个lock.notify();语句。它显然卡在了wait()
上。但是如果您使用的是AtomicInteger
,那么这个锁就毫无意义了。啊!正确。非常感谢。它卡在wait()上
很明显。但是如果你使用的是原子整数,那么锁是毫无意义的。啊!正确。非常感谢。哦,好吧,我也想到了。我一发布我的答案,页面就会刷新以显示你的答案。不过,非常感谢你的答案。哦,好吧,我也想到了。我一发布我的答案,页面就会参考很高兴展示你的答案。不过非常感谢你的回答。