Java 生产者/消费者问题实例详解

2025-05-29 0 95

生产者消费者问题是线程模型中的经典问题:生产者消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

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
/*

author by w3cschool.cc

ProducerConsumerTest.java

*/

public class ProducerConsumerTest {

public static void main(String[] args) {

CubbyHole c = new CubbyHole();

Producer p1 = new Producer(c, 1);

Consumer c1 = new Consumer(c, 1);

p1.start();

c1.start();

}

}

class CubbyHole {

private int contents;

private boolean available = false;

public synchronized int get() {

while (available == false) {

try {

wait();

}

catch (InterruptedException e) {

}

}

available = false;

notifyAll();

return contents;

}

public synchronized void put(int value) {

while (available == true) {

try {

wait();

}

catch (InterruptedException e) {

}

}

contents = value;

available = true;

notifyAll();

}

}

class Consumer extends Thread {

private CubbyHole cubbyhole;

private int number;

public Consumer(CubbyHole c, int number) {

cubbyhole = c;

this.number = number;

}

public void run() {

int value = 0;

for (int i = 0; i < 10; i++) {

value = cubbyhole.get();

System.out.println("消费者 #" + this.number+ " got: " + value);

}

}

}

class Producer extends Thread {

private CubbyHole cubbyhole;

private int number;

public Producer(CubbyHole c, int number) {

cubbyhole = c;

this.number = number;

}

public void run() {

for (int i = 0; i < 10; i++) {

cubbyhole.put(i);

System.out.println("生产者 #" + this.number + " put: " + i);

try {

sleep((int)(Math.random() * 100));

} catch (InterruptedException e) { }

}

}

}

以上代码运行输出结果为:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
消费者 #1 got: 0

生产者 #1 put: 0

生产者 #1 put: 1

消费者 #1 got: 1

生产者 #1 put: 2

消费者 #1 got: 2

生产者 #1 put: 3

消费者 #1 got: 3

生产者 #1 put: 4

消费者 #1 got: 4

生产者 #1 put: 5

消费者 #1 got: 5

生产者 #1 put: 6

消费者 #1 got: 6

生产者 #1 put: 7

消费者 #1 got: 7

生产者 #1 put: 8

消费者 #1 got: 8

生产者 #1 put: 9

消费者 #1 got: 9

希望本篇文章对您有所帮助

原文链接:http://www.2cto.com/kf/201601/486921.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java 生产者/消费者问题实例详解 https://www.kuaiidc.com/117591.html

相关文章

发表评论
暂无评论