在进行多线程学习时一个练习题:使用两个线程分别打印数字和字母,并控制两个线程交替进行。打印结果: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方法),
没人唤醒他了,他就一直等着,所以程序也停不下来。