问题描述
程序不写了,我复述一下吧:程序是要用多线程完成0和1在控制台上的交替输出一个类里,我定义两个方法,一个加一,一个减一。加和减里,我都做了判断,用到了wait()方法和notify;之后定义了两个Thread的继承类,一个run()了加一,一个run()了减一。最后,main方法里,我new了一个含有加一和减一的类,然后start了两个Tread类。结果完成了0和1的替换。但是只要超过了2个线程,结果就会出现问题。原因是加一和减一方法中判断是否wait是用了if,应该改成while;改完之后,还要将notify改成notifyAll。今天发现了另外一个方法,好神奇:不用改notify就是在Thread类的run方法中设置一个sleep,让此线程睡上1秒,效果和notifyAll一样。这里注意一下,我的Thread类中run类是用了for的,循环了20次,如果不改notify,0和1出现几次,程序就卡在那里了,想必是notify唤醒wait之后,wait遇到while,死循环在哪里了,但是还是想不通,为什么用了sleep之后,notify就能准确的唤醒正确的线程呢。
解决方案
解决方案二:
你关键的代码也要贴点,要不谁知道你的错误发生在哪?你明白notify和notifyAll的区别,也就基本明白了为啥这样;notify选择是任意性的,所以当线程大于2时,若唤醒的线程不具备条件时又会wait,这样所有的线程都在wait,就是你说的程序就卡在那里了;而notifyAll会唤醒在此对象监视器上等待的所有线程,也就是说总有一个线程会满足你的if或while条件,因此总会有一个线程会继续运行,并nofityAll,所以程序没问题;虽然不知道你把sleep放在哪里,既然没问题,我想你的sleep放在if或while条件之后,但还没有引起其它线程的if或while条件满足,当这个线程sleep1秒,对于CPU来说,足以让所有的其它线程都调用run方法,也就是其它线程都会进入wait了;当你这个线程再次运行时,notify哪个线程都会唤醒其中一个了;