生产者与消费者基本程序
在多线程的开发过程之中最为著名的案例就是生产者与消费者操作,该操作的主要流程如下:
生产者负责信息内容的生产
每当生产者生产完成一项完整的信息之后消费者要从这里面取走信息;
如果生产者没有生成者则消费者要等待它生产完成,如果消费者还没有对信息进行消费,则生产者应该等待消费者处理完成后再继续生成
可以将生产者与消费者定义为两个独立的线程类对象,但是对于现在生成的数据,可以使用以下组成
数据一:title = 王建,content = 宇宙大帅哥;
数据二:title = 小高,content = 猥琐第一人;
既然生产者与消费者是两个独立的线程,那么这两个独立的线程之间就需要有一个数据的保存集中点,那么可以单独定义一个Message类实现数据保存
通过整个代码的执行你会发现此时有两个主要的问题:
问题一:数据不同步;
问题二:生产一个取走一个,但是有重复生产与重复取出的问题
解决生产者-消费者同步问题(解决数据同步)
首先解决数据同步问题,最简单办法是使用synchronized关键字,使用同步代码块或同步方法,于是这个时候对于同步的处理就可以直接在Message类中完成。
在进行同步处理的时候肯定需要有一个同步的处理对象,那么此时肯定要将同步操作交由Message类处理是最合适的。这个时候发现数据已经可以保持一致了,但是对于重复操作的问题依然存在。也就是说同步不能解决重复操作的问题。
利用Object类解决重复操作问题(线程等待与唤醒机制)
如果说现在要想解决生产者与消费者的问题,那么最好的解决方案就是使用等待与唤醒机制。而对于等待与唤醒机制主要依靠的是Object类中提供的方法处理的:有三个方法
如果此时有若干个等待线程的话,那么notify()表示的是唤醒第一个等待的,而其他的线程继续等待,而notifyAll()会唤醒所有等待的线程,哪个线程优先级高就有可能先执行。
对于当前的问题主要的解决应该是通过Message类完成处理、
这种处理形式就是在进行多线程开发过程之中最原始的处理方案,整个的等待、同步、唤醒机制都由开发者自行通过原生代码控制
现在的执行结果
生产一个,取走一个,生产一个,取走一个