Java 对于下面的程序,当线程完成其工作时,';t主线程停止?

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

这个程序通过不同的线程打印交替的数字来工作,但是当所有0-9的数字都打印出来时,为什么这个程序不停止呢?我必须手动停止我的应用程序

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()上
很明显。但是如果你使用的是
原子整数,那么锁是毫无意义的。啊!正确。非常感谢。哦,好吧,我也想到了。我一发布我的答案,页面就会刷新以显示你的答案。不过,非常感谢你的答案。哦,好吧,我也想到了。我一发布我的答案,页面就会参考很高兴展示你的答案。不过非常感谢你的回答。