public void run() {//因为这里是死循环,只要进来就跳不出去,有可能会出现两个线程交替执行一段时间,但是当flag为true时,这里就死循环了,那cpu不是交替执行线程的吗?难道消费者的线程就一直抢不到执行权吗?就用打印方法验证一下就知道了,发现当加入打印的方法后两个线程还是会有非常小的几率交替执行,当然99.9%的还是死循环的打印方法,所以在两个线程的run方法中加点睡眠时间看看效果,此时将打印的方法都关闭,这时发现生产者生产2商品后程序又死循环了,可以想到这么一种情况,当消费完1号后生产者可以说是瞬间生产2后进入睡眠,之后消费者和生产者可以说是同时醒来,因为生产者是死循环,效率比较快,一直抢得到执行权。为什么这么说,通过打印的方法就可以看到,满屏的pro...out。那也有可能是消费者那里死循环的吧,满屏的cus...out也是可能的?那么把其他的打印语句关掉这里只打开cus...out,又一种神奇的现象出现了,竟然可以看到比较和谐的景象,这又是为什么呢?至此打住!到目前为止答案已经很清晰了,问题就出现在while循环上,那么这里就考虑毕老师视频讲的例子一样,操作资源和标记的事情都交给资源类res去完成,另外在方法中加入wait方法和notify方法实现线程安全和生产消费和谐的画面
if (!(r.flag)) {//总结:错误的代码何其多,我们需要的做的就是多使用像打印语句这样调试程序的方法找到问题所在,不必过于深究底层到底谁抢到了cpu,谁没抢到到的情况,毕竟学习的重点不在这种钻牛角尖 的问题,学会 熟练地实现线程安全的做法才是王道