多线程练习过程中不可以正常jvm不可以正常退出

在进行多线程学习时一个练习题:使用两个线程分别打印数字和字母,并控制两个线程交替进行。打印结果:1A2B........,但是在实现代码后发现线程不可以正常结束如图,求大神解围

public class TestPrint {
    public static void main(String[] args){
        Object lock = new Object();
        new Thread(()->{
            synchronized (lock) {
                for (int i = 1; i <= 26; i++) {
                    System.out.println(i);
                    lock.notify();
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(()->{
            synchronized (lock) {
                for (int i = 1; i <= 26; i++) {
                    System.out.println((char)(i+64));
                    lock.notify();
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

图片说明

那是因为两个线程后面都执行了 lock.wait 阻塞等待了,需要第三个线程唤醒它们。在main 函数后面继续加上一段代码:

try {
            Thread.sleep(1000);
            synchronized (lock) {
                lock.notifyAll();
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

main 线程休眠一秒后唤醒 lock 锁上阻塞的线程就可以了哦。Java 并发编程的技术知识我写过一个专栏,这类常见问题都有介绍,有兴趣可以看看哈。

两个线程在各自执行自己的同步代码,这两个线程是互相唤醒的关系,
但到最后的时候上面的循环已经结束了,所以后面的线程虽然执行完了最后一次循环,但也进入了等待池(执行了wait方法),
没人唤醒他了,他就一直等着,所以程序也停不下来。