简介 生产者消费者问题是线程模型中的一个经典问题:生产者和消费者在同一时间段共享同一个存储空间,如下图所示,生产者空间存储数据,消费者访问数据。如果没有协调,可能会出现以下情况:生产者消费者图 存储空间满了,生产者占用了,消费者等着生产者放手生产者从产品中取出产品空间,生产者等待消费者消费产品,从而将产品添加到空间中。互相等待,造成死锁。 生产者消费者问题是研究多线程程序绕不开的经典问题之一。它描述了有一个缓冲区作为仓库。拿起产品。生产者/消费者问题的解决方案可以分为两类: (1)使用某种机制来保护生产者和消费者之间的同步; (2)生产者与消费者之间建立管道。 第一种方法效率更高,容易实现。代码的可控性较好,是常用的模式。第二种流水线缓冲区不易控制,传输的数据对象不易封装等,实用性不强。因此本文只介绍同步机制实现的生产者/消费者问题。 同步问题的核心是:如何保证同一个资源在多个线程并发访问时的完整性。一种常见的同步方法是使用信号或锁定机制来确保资源在任何时候最多被一个线程访问。Java语言在多线程编程中实现了完全的对象化,对同步机制提供了良好的支持。Java中一共有四种方法支持同步,其中前三种是同步方法,一种是管道方法。(1)wait()/notify()方法(2)await()/signal()方法(3)BlockingQueue阻塞队列方法(4)PipedInputStream/PipedOutputStream本文只介绍最常用的前两种,第三种和第四条暂时不讨论,有兴趣的读者可以自行去网上寻找答案。1.wait()/notify()方法 wait()/nofity()方法是基类Object的两个方法,也就是说所有的Java类都会有这两个方法,这样我们就可以提供任何对象实现一种同步机制。 wait()方法:当缓冲区满/空时,生产者/消费者线程停止自己的执行,放弃锁,让自己进入等待状态,让其他线程执行。 notify()方法:当生产者/消费者将产品放入/取出缓冲区时,向其他等待线程发送可执行通知,同时放弃锁使自己进入等待状态.代码实现:1.仓库类importjava.util.LinkedList;/***仓库类Storage实现缓冲区**@authorzcr*/publicclassStorage{//仓库***存储容量privatefinalintMAX_SIZE=100;//仓库存储的载体privateLinkedList