0%

多线程--管程法的代码实现

image-20210313140511586

管程法是并发协作模型“生产者/消费者模式”实现方式的一种。

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
import org.w3c.dom.ls.LSOutput;

/**
* @author :風楪fy
* @date :Created in 2021/3/13 - 14:08
*/
public class Test {
public static void main(String[] args) {
Container container = new Container();
Producer producer = new Producer(container);
Consumer consumer = new Consumer(container);
producer.start();
consumer.start();
}
}

//食物
class Food{
int id;
public Food(int id) {
this.id = id;
}
}

//缓存区
class Container{

Food[] foods = new Food[10];//存储容器
int count;//计数器

public synchronized void push(Food food){
//容器没有空间,无法生产,进入等待状态
while (count == foods.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//容器有空间,将生产食物到容器
foods[count] = food;
count++;
this.notifyAll();
}

public synchronized Food consume(){
//容器没有食物,无法消费,进入等待状态
while(count == 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//容器有食物,消费一个并返回消费掉的
count--;
Food food = foods[count];
this.notifyAll();
return food;
}
}

//生产者
class Producer extends Thread{
private Container container;

public Producer(Container container) {
this.container = container;
}

@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("生产第"+i+"个馒头");
container.push(new Food(i));
}
}
}

//消费者
class Consumer extends Thread{
private Container container;

public Consumer(Container container) {
this.container = container;
}

@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消费第"+container.consume().id+"个馒头");
}
}
}