生产者/消费者模式(一)

生产者/消费者模式

多线程环境下,我们经常需要多个线程的并发和协作。这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”。

什么是生产者?

生产者指的是负责生产数据的模块(这里模块可能是:方法、对象、线程、进程)。

什么是消费者?

消费者指的是负责处理数据的模块(这里模块可能是:方法、对象、线程、进程)。

什么是缓冲区?

消费者不能直接使用生产者的数据,它们之间有个“缓冲区”。生产者将生产好的数据放入“缓冲区”,消费者从“缓冲区”拿要处理的数据。

实现线程的并发协作

有了缓冲区以后,生产者线程只需要往缓冲区里面放置数据,而不需要管消费者消费的情况;同样,消费者只需要从缓冲区拿数据处理即可,也不需要管生产者生产的情况。 这样,就从逻辑上实现了“生产者线程”和“消费者线程”的分离。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
* 生产者/消费者模式:管程法。
*
*/
public class Consumer_Model {

public static void main(String[] args) {
// TODO Auto-generated method stub
Business bus=new Business();
Warehouse wa=new Warehouse(bus);
Thread th=new Thread(wa);
th.start();
Consumer wb=new Consumer(bus);
wb.start();
}

}
//厂家
class Warehouse implements Runnable{
private Business bus;
public Warehouse(Business bus) {
this.bus = bus;
}
@Override
public void run() {
// 生产
for(int i=0;i<50;i++)
{
System.out.println("---------------------");
System.out.println("生产第"+(i+1)+"个产品");
bus.put(new Commodity(i));
}
}

}
//消费者
class Consumer extends Thread{
private Business bus;
public Consumer(Business bus) {
this.bus = bus;
}
@Override
public void run() {
// 消费
for(int i=0;i<50;i++)
{
System.out.println("消费第"+(bus.take().id+1)+"个产品");
System.out.println("---------------------");
}
}

}
//中间商
class Business{
private Commodity[] con=new Commodity[10];
private int i=0;
//存放数据
public synchronized void put(Commodity co) {
if(i==con.length) {
try {
this.wait();
System.out.println("没有位置停止生产");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
con[i]=co;
i++;
this.notifyAll();
}
//取出数据
public synchronized Commodity take() {
if(i==0) {
try {
this.wait();//线程阻塞
System.out.println("没有商品停止消费");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
i--;
Commodity cob=con[i];
this.notifyAll();
return cob;
}
}
//商品
class Commodity{
int id;
public Commodity(int id) {
super();
this.id = id;
}

}
原创技术分享,您的支持将鼓励我继续创作
0%