操作系统——生产者消费者问题

目标:用信号量机制解决生产者消费者问题

生产者消费者问题是操作系统和多线程的很常见的也很经典的一个问题,描述大致如下:生产者生产资料,消费者消费资料。如果说资料过多,那么生产者等待;如果说资料过少,那么消费者等待。

这么说可能不太清楚,我们可以这样去理解:有一个包子店,顾客(消费者)在门口排队买包子,新鲜的包子又在源源不断地从蒸笼(生产者)里面蒸熟供购买。如果说包子不够了,那么顾客就需要排队等候(消费者等待);如果说包子太多了放不下了,那么就不能继续蒸了,要等会儿了(生产者等待)。

用java实现的代码如下:

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
/**
* Created by daniel on 2017/3/16.
*/

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ProducerConsumer {
private static Integer count = 0;
private final Lock lock = new ReentrantLock();
private final Condition NotFull = lock.newCondition();
private final Condition NotEmpty = lock.newCondition();

public static void main(String[] args) throws Exception {
ProducerConsumer producerConsumer = new ProducerConsumer();
new Thread(producerConsumer.new Producer()).start();
new Thread(producerConsumer.new Consumer()).start();
new Thread(producerConsumer.new Producer()).start();
new Thread(producerConsumer.new Consumer()).start();

new Thread(producerConsumer.new Producer()).start();
new Thread(producerConsumer.new Consumer()).start();
new Thread(producerConsumer.new Producer()).start();
new Thread(producerConsumer.new Consumer()).start();
}

class Producer implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(0);
} catch (Exception e) {
e.printStackTrace();
}
lock.lock();
try {
Integer FULL = 20;
while (count.equals(FULL)) {
try {
NotFull.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println(Thread.currentThread().getName()
+ "生产者生产,目前总共有" + count);
NotEmpty.signal();
} finally {
lock.unlock();
}

}
}
}

class Consumer implements Runnable {

@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(0);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
lock.lock();
try {
while (count == 0) {
try {
NotEmpty.await();
} catch (Exception e) {
e.printStackTrace();
}
}
count--;
System.out.println(Thread.currentThread().getName()
+ "消费者消费,目前总共有" + count);
NotFull.signal();
} finally {
lock.unlock();
}
}
}
}
}
结果如下:
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
Thread-0生产者生产,目前总共有1
Thread-2生产者生产,目前总共有2
Thread-0生产者生产,目前总共有3
Thread-2生产者生产,目前总共有4
Thread-0生产者生产,目前总共有5
Thread-2生产者生产,目前总共有6
Thread-4生产者生产,目前总共有7
Thread-5消费者消费,目前总共有6
Thread-3消费者消费,目前总共有5
Thread-5消费者消费,目前总共有4
Thread-3消费者消费,目前总共有3
Thread-3消费者消费,目前总共有2
Thread-3消费者消费,目前总共有1
Thread-3消费者消费,目前总共有0
Thread-6生产者生产,目前总共有1
Thread-7消费者消费,目前总共有0
Thread-0生产者生产,目前总共有1
Thread-2生产者生产,目前总共有2
Thread-4生产者生产,目前总共有3
Thread-5消费者消费,目前总共有2
Thread-3消费者消费,目前总共有1
Thread-5消费者消费,目前总共有0
Thread-6生产者生产,目前总共有1
Thread-6生产者生产,目前总共有2
Thread-6生产者生产,目前总共有3
Thread-6生产者生产,目前总共有4
Thread-6生产者生产,目前总共有5
Thread-7消费者消费,目前总共有4
Thread-6生产者生产,目前总共有5
Thread-0生产者生产,目前总共有6
Thread-6生产者生产,目前总共有7
Thread-0生产者生产,目前总共有8
Thread-6生产者生产,目前总共有9
Thread-0生产者生产,目前总共有10
Thread-6生产者生产,目前总共有11
Thread-2生产者生产,目前总共有12
Thread-2生产者生产,目前总共有13
Thread-4生产者生产,目前总共有14
Thread-4生产者生产,目前总共有15
Thread-3消费者消费,目前总共有14
Thread-3消费者消费,目前总共有13
Thread-5消费者消费,目前总共有12
Thread-5消费者消费,目前总共有11
Thread-1消费者消费,目前总共有10
Thread-1消费者消费,目前总共有9
Thread-7消费者消费,目前总共有8
Thread-1消费者消费,目前总共有7
Thread-1消费者消费,目前总共有6
Thread-0生产者生产,目前总共有7
Thread-2生产者生产,目前总共有8
Thread-2生产者生产,目前总共有9
Thread-4生产者生产,目前总共有10
Thread-2生产者生产,目前总共有11
Thread-2生产者生产,目前总共有12
Thread-3消费者消费,目前总共有11
Thread-5消费者消费,目前总共有10
Thread-5消费者消费,目前总共有9
Thread-5消费者消费,目前总共有8
Thread-7消费者消费,目前总共有7
Thread-7消费者消费,目前总共有6
Thread-7消费者消费,目前总共有5
Thread-1消费者消费,目前总共有4
Thread-7消费者消费,目前总共有3
Thread-1消费者消费,目前总共有2
Thread-1消费者消费,目前总共有1
Thread-1消费者消费,目前总共有0
Thread-0生产者生产,目前总共有1
Thread-0生产者生产,目前总共有2
Thread-4生产者生产,目前总共有3
Thread-3消费者消费,目前总共有2
Thread-4生产者生产,目前总共有3
Thread-5消费者消费,目前总共有2
Thread-7消费者消费,目前总共有1
Thread-7消费者消费,目前总共有0
Thread-4生产者生产,目前总共有1
Thread-7消费者消费,目前总共有0
Thread-4生产者生产,目前总共有1
Thread-1消费者消费,目前总共有0
Thread-4生产者生产,目前总共有1
Thread-1消费者消费,目前总共有0
请博主喝杯咖啡~
0%