生产者安全地将数据交给消费者。Producer-Consumer模式在生产者和消费者之间加入了一个“桥梁角色”。该桥梁角色用于消除线程间处理速度的差异。
示例
有3位糕点师制作蛋糕并将其放到桌子上,然后有3位客人来吃这些蛋糕。
时序图
Main.java
1 | public class Main { |
MakerThread.java
1 | import java.util.Random; |
EaterThread.java
1 | import java.util.Random; |
Table.java
1 | public class Table { |
运行结果
1 | MakerThread-3 puts [ Cake No.20 by MakerThread-3 ] |
登场角色
Data
Data角色由Producer角色生成,供Consumer角色使用。在示例程序中,由String类扮演此角色。
Producer(生产者)
Producer角色生成Data角色,并将其传递给Channel角色。在示例程序中,由MakerThread扮演此角色。
Consumer(消费者)
Consumer角色从Channel角色获取Data角色并使用。在示例程序中,由EaterThread扮演此角色。
Channel(通道)
Channel角色保管从Producer角色获取的Data角色,还会响应Consumer角色的请求,传递Data角色。为了确保安全性,Channel角色会对Producer角色和Consumer角色的访问执行互斥处理。
当Producer角色将Data角色传递给Channel角色时,如果Channel角色的状态不适合接收Data角色,那么Producer角色将一直等待,直至Channel角色的状态变为可以接收为止。
当Consumer角色从Channel角色获取Data角色时,如果Channel角色中没有可以传递的Data角色,那么Consumer角色将一直等待,直至Channel的状态变为可以传递Data角色为止。
在示例程序中,由Table类扮演此角色。