Producer & Consumer
文章目录
Producer & ConsumerProducer & Consumer模式介绍Producer & Consumer的使用场景Producer & Consumer示例代码分析Producer & Consumer的理解
Producer & Consumer模式介绍
生产者是指生产数据的线程,消费者是指使用数据的线程;生产者-消费者模式是一种为实现生产者安全地将数据交给消费者这一目标而存在的模式;
Producer & Consumer的使用场景
生产数据和使用数据的线程并不相同,且互不干扰;
Producer & Consumer示例代码分析
public class Consumer extends Thread {
private final Random random
;
private final Table table
;
public Consumer(String name
,Table table
, long seed
){
super(name
);
this.table
=table
;
random
=new Random(seed
);
}
public void run(){
try{
while(true){
table
.take();
Thread
.sleep(random
.nextInt(1000));
}
}catch (InterruptedException e
){
e
.printStackTrace();
}
}
}
public class Producer extends Thread {
private final Random random
;
private final Table table
;
private static int id
=0;
public Producer(String name
,Table table
,long seed
){
super(name
);
this.random
=new Random(seed
);
this.table
=table
;
}
public void run(){
try{
while(true){
Thread
.sleep(random
.nextInt(1000));
String cake
="[Cake NO."+nextId()+" by "+getName()+"]";
table
.put(cake
);
}
}catch(InterruptedException e
){
e
.printStackTrace();
}
}
private static synchronized int nextId(){
return id
++;
}
}
public class Table{
private final String
[] buffer
;
private int tail
;
private int head
;
private int count
;
public Table(int count
){
this.buffer
=new String[count
];
this.head
=0;
this.tail
=0;
this.count
=0;
}
public synchronized void put(String cake
) throws InterruptedException
{
System
.out
.println(Thread
.currentThread().getName()+" puts "+cake
);
while(count
>=buffer
.length
){
wait();
}
buffer
[tail
]=cake
;
tail
=(tail
+1)%buffer
.length
;
count
++;
notifyAll();
}
public synchronized void take() throws InterruptedException
{
while(count
<=0){
wait();
}
String cake
=buffer
[head
];
head
=(head
+1)%buffer
.length
;
count
--;
notifyAll();
System
.out
.println(Thread
.currentThread().getName()+" takes "+cake
);
}
}
public class Tester {
public static void main(String
[] args
){
Table table
=new Table(3);
new Producer("Producer-1",table
,31415).start();
new Producer("Producer-2",table
,33333).start();
new Producer("Producer-3",table
,12345).start();
new Consumer("Consumer-1",table
,31415).start();
new Consumer("Consumer-2",table
,33333).start();
new Consumer("Consumer-3",table
,12345).start();
}
}
Producer & Consumer的理解
因为Consumer和Producer分别属于两个不同的线程,它们之间通过数据联系;而数据的管理者——Table起到了协调这两种线程的作用:put和take方法分别使用Guarded Suspension模式来协调二者;也就是说,在该模式中,承担守护者责任的是Table类,它维持着线程的协调运行和互斥处理;
生产者和消费者模式是一种常见的多线程协作模式;