java 生产者消费者问题Word文档格式.docx
- 文档编号:17270968
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:17
- 大小:27.45KB
java 生产者消费者问题Word文档格式.docx
《java 生产者消费者问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《java 生产者消费者问题Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
4.
*
仓库类Storage实现缓冲区
5.
6.
@author
zcr
7.
*/
8.public
class
Storage
9.{
10.
//
仓库最大存储量
11.
private
final
int
MAX_SIZE
=
100;
12.
13.
仓库存储的载体
14.
LinkedList<
Object>
list
new
();
15.
16.
/**
17.
生产num个产品
18.
@param
num
生产产品的数量
19.
20.
public
void
produce(int
num)
21.
{
22.
同步代码段
23.
synchronized
(list)
24.
25.
如果仓库剩余容量不足
26.
while
(list.size()
+
>
MAX_SIZE)
27.
28.
System.out.println("
【要生产的产品数量】:
"
\t
【库存量】:
29.
list.size()
暂时不能执行生产任务!
);
30.
try
31.
32.
由于条件不满足,生产阻塞
33.
list.wait();
34.
}
35.
catch
(InterruptedException
e)
36.
37.
e.printStackTrace();
38.
39.
40.
41.
生产条件满足情况下,生产num个产品
42.
for
(int
i
1;
<
num;
++i)
43.
44.
list.add(new
Object());
45.
46.
47.
【已经生产产品数】:
【现仓储量为】:
list.size());
48.
49.
list.notifyAll();
50.
51.
52.
53.
54.
消费num个产品
55.
消费产品数量
56.
57.
consume(int
58.
59.
60.
61.
62.
如果仓库存储量不足
63.
64.
65.
【要消费的产品数量】:
\t【库存量】:
66.
67.
68.
69.
由于条件不满足,消费阻塞
70.
71.
72.
73.
74.
75.
76.
77.
78.
消费条件满足情况下,消费num个产品
79.
80.
81.
list.remove();
82.
83.
84.
【已经消费产品数】:
85.
86.
87.
88.
89.
90.
get/set方法
91.
getList()
92.
93.
return
list;
94.
95.
96.
setList(LinkedList<
list)
97.
98.
this.list
99.
100.
101.
getMAX_SIZE()
102.
103.
MAX_SIZE;
104.
105.}
2、生产者
1./**
生产者类Producer继承线程类Thread
3.
Producer
extends
Thread
每次生产的产品数量
所在放置的仓库
storage;
构造函数,设置仓库
Producer(Storage
storage)
this.storage
线程run函数
run()
produce(num);
调用仓库Storage的生产函数
storage.produce(num);
getNum()
setNum(int
this.num
getStorage()
setStorage(Storage
54.}
3、消费者
消费者类Consumer继承线程类Thread
Consumer
每次消费的产品数量
Consumer(Storage
consume(num);
storage.consume(num);
4、测试类
测试类Test
6.public
Test
7.{
8.
static
main(String[]
args)
9.
仓库对象
storage
Storage();
生产者对象
p1
Producer(storage);
p2
p3
p4
p5
p6
p7
消费者对象
c1
Consumer(storage);
c2
c3
设置生产者产品生产数量
p1.setNum(10);
p2.setNum(10);
p3.setNum(10);
p4.setNum(10);
p5.setNum(10);
p6.setNum(10);
p7.setNum(80);
设置消费者产品消费数量
c1.setNum(50);
c2.setNum(20);
c3.setNum(30);
线程开始执行
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
53.}
5、结果:
1.【要消费的产品数量】:
50
0
2.【要消费的产品数量】:
20
3.【已经生产产品数】:
10
4.【要消费的产品数量】:
5.【要消费的产品数量】:
6.【已经生产产品数】:
7.【已经生产产品数】:
30
8.【要消费的产品数量】:
9.【已经消费产品数】:
10.【已经生产产品数】:
11.【已经生产产品数】:
12.【要消费的产品数量】:
13.【已经生产产品数】:
40
14.【已经消费产品数】:
15.【要消费的产品数量】:
16.【已经生产产品数】:
80
90
17.【已经消费产品数】:
看完上述代码,对wait()/notify()方法实现的同步有了了解。
你可能会对Storage类中为什么要定义publicvoidproduce(intnum);
和publicvoidconsume(intnum);
方法感到不解,为什么不直接在生产者类Producer和消费者类Consumer中实现这两个方法,却要调用Storage类中的实现呢?
淡定,后文会有解释。
我们先往下走。
二、await()/signal()方法
在JDK5.0之后,Java提供了更加健壮的线程处理机制,包括同步、锁定、线程池等,它们可以实现更细粒度的线程控制。
await()和signal()就是其中用来做同步的两种方法,它们的功能基本上和wait()/nofity()相同,完全可以取代它们,但是它们和新引入的锁定机制Lock直接挂钩,具有更大的灵活性。
通过在Lock对象上调用newCondition()方法,将条件变量和一个锁对象进行绑定,进而控制并发程序访问竞争资源的安全。
下面来看代码:
只需要更新仓库类Storage的代码即可,生产者Producer、消费者Consumer、测试类Test的代码均不需要进行任何更改。
仓库类
2.import
java.util.concurrent.locks.Condition;
3.import
java.util.concurrent.locks.Lock;
4.import
java.util.concurrent.locks.ReentrantLock;
6./**
MONKEY.D.MENG
2011-03-15
13.public
14.{
锁
Lock
lock
ReentrantLock();
仓库满的条件变量
Condition
full
lock.newCondition();
仓库空的条件变量
empty
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 生产者消费者问题 生产者 消费者 问题