1
+ package com .duwei .multythread ;
2
+
3
+ import java .util .LinkedList ;
4
+ import java .util .Queue ;
5
+ import java .util .Random ;
6
+ /**
7
+ * 生产者消费者问题
8
+ * http://developer.51cto.com/art/201508/487488.htm
9
+ * @author 杜伟
10
+ */
11
+ public class ProducerConsumerInJava {
12
+
13
+ public static void main (String args []) {
14
+ System .out .println ("如何在java中使用 wait and notify" );
15
+ System .out .println ("解决生产者消费者问题" );
16
+ Queue <Integer > buffer = new LinkedList <>();
17
+ int maxSize = 10 ;
18
+ Thread producer = new Producer (buffer , maxSize , "PRODUCER" );
19
+ Thread consumer = new Consumer (buffer , maxSize , "CONSUMER" );
20
+ producer .start ();
21
+ consumer .start ();
22
+ }
23
+ }
24
+ /**
25
+ * Producer Thread will keep producing values for Consumer
26
+ * to consumer. It will use wait() method when Queue is full
27
+ * and use notify() method to send notification to Consumer
28
+ * Thread.
29
+ */
30
+ class Producer extends Thread {
31
+ private Queue <Integer > queue ;
32
+ private int maxSize ;
33
+
34
+ public Producer (Queue <Integer > queue , int maxSize , String name ){
35
+ super (name );
36
+ this .queue = queue ;
37
+ this .maxSize = maxSize ;
38
+ }
39
+ @ Override
40
+ public void run () {
41
+ while (true ){
42
+ synchronized (queue ) {
43
+ while (queue .size () == maxSize ) {
44
+ try {
45
+ System .out .println ("队列满, " + "Producer thread waiting for " + "consumer to take something from queue" );
46
+ queue .wait ();
47
+ } catch (Exception ex ) {
48
+ ex .printStackTrace (); }
49
+ }
50
+ Random random = new Random ();
51
+ int i = random .nextInt ();
52
+ System .out .println ("Producing value : " + i ); queue .add (i ); queue .notifyAll ();
53
+ }
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Consumer Thread will consumer values form shared queue.
59
+ * It will also use wait() method to wait if queue is
60
+ * empty. It will also use notify method to send
61
+ * notification to producer thread after consuming values
62
+ * from queue.
63
+ *
64
+ */
65
+ class Consumer extends Thread {
66
+ private Queue <Integer > queue ;
67
+ private int maxSize ;
68
+
69
+ public Consumer (Queue <Integer > queue , int maxSize , String name ){
70
+ super (name );
71
+ this .queue = queue ;
72
+ this .maxSize = maxSize ;
73
+ }
74
+ @ Override
75
+ public void run () {
76
+ while (true ) {
77
+ synchronized (queue ) {
78
+ while (queue .isEmpty ()) {
79
+ System .out .println ("Queue is empty," + "Consumer thread is waiting" + " for producer thread to put something in queue" );
80
+ try {
81
+ queue .wait ();
82
+ } catch (Exception ex ) {
83
+ ex .printStackTrace ();
84
+ }
85
+ }
86
+ System .out .println ("Consuming value : " + queue .remove ()); queue .notifyAll ();
87
+ }
88
+ }
89
+ }
90
+ }
0 commit comments