java - 对于下面的程序,当线程完成工作时,为什么主线程不停止?

标签 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 (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();
    }
}

最佳答案

那是因为最后一个线程陷入了waitnotifyAll 将通知所有等待线程(如果有)并释放锁。

while (num.get()<10){
  // existing implementation
}
lock.notifyAll();

关于java - 对于下面的程序,当线程完成工作时,为什么主线程不停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50789396/

相关文章:

java - 当邮政编码以 0 开头或以 0 结尾时,程序无法运行

objective-c - 如何结束使用 detachNewThreadSelector 创建的轮询线程?

java - Android 后台任务、UI 线程和配置更改

Android 设备插入 USB 与未插入时的行为不同

java - 通过parse.com添加图片库

java - 将 XML 映射到 Java 中的对象

Python 使用 subprocess.Popen 关闭所有线程或进程

java - Java 中生产者消费者关系程序的输出不一致

java - 圆形 float 到更接近(或最接近的)

java - HashMap 内 HashMap 的平均值