多线程
生产者消费者问题是一个经典、多线程并发协作问题。生产者消费者问题包含两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域。生产者生产完数据之后放到共享区域中,并不需要关心消费者的行为;而消费者只需要从共享区域中取出数据,不需要关心生产者的行为。但是,
- 数据区域满时,生产者不能继续生产。
- 数据区域为空时,消费者不能继续消费。
- 每次只能有一个线程操作共享数据区域。
在实现生产者消费者问题时,可以采用三种方式:
- 使用Object的wait/notify的消息通知机制
- 使用Lock的condition的await/signal的消息通知机制
- 使用BlockingQueue
1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)
2.notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。
3.wait(long timeout)让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
参考文献
[1]https://www.jianshu.com/p/b16296e9ac85
[2]https://www.jianshu.com/p/e29632593057