producer consumer pattern example
1.1 MyTest.java #
public class MyTest { public static void main(String[] args) { MyQueue queue = new MyQueue(3); new Producer(queue, "producer 1", 11111111L).start(); new Producer(queue, "producer 2", 22222222L).start(); new Producer(queue, "producer 3", 33333333L).start(); new Consumer(queue, "consumer 1", 44444444L).start(); new Consumer(queue, "consumer 2", 55555555L).start(); new Consumer(queue, "consumer 3", 66666666L).start(); } }
1.2 Producer.java #
import java.util.Random; public class Producer extends Thread { private Random random; private MyQueue queue; private static int id = 0; public Producer(MyQueue queue, String name, long randomSeed) { super(name); this.queue = queue; this.random = new Random(randomSeed); } public void run() { while (true) { MyData data = new MyData("NO:" + id++); try { queue.putData(data); Thread.sleep(random.nextInt(1000)); } catch (Exception e) { e.printStackTrace(); } } } }
1.3 Consumer.java #
import java.util.Random; public class Consumer extends Thread { private Random random; private MyQueue queue; public Consumer(MyQueue queue, String name, long randomeSeed) { super(name); this.queue = queue; this.random = new Random(randomeSeed); } public void run() { while(true){ try{ queue.getData(); Thread.sleep(random.nextInt(1000)); } catch(Exception e){ e.printStackTrace(); } } } }
1.4 MyQueue.java #
public class MyQueue { private final MyData[] buffer; private int head; private int tail; private int count; public MyQueue(int count) { this.buffer = new MyData[count]; this.head = 0; this.tail = 0; this.count = 0; } public synchronized MyData getData() throws Exception { while (count <= 0) { System.out.println(Thread.currentThread().getName() + " start waiting"); wait(); } MyData data = buffer[head]; head = (head + 1) % buffer.length; count--; notifyAll(); System.out.println(Thread.currentThread().getName() + " get data : " + data+" count:"+count); return data; } public synchronized void putData(MyData data) throws Exception { while (count >= buffer.length) { System.out.println(Thread.currentThread().getName() + " start waiting"); wait(); } buffer[tail] = data; tail = (tail + 1) % buffer.length; count++; notifyAll(); System.out.println(Thread.currentThread().getName() + " put data : " + data+" count:"+count); } }
1.5 MyData.java #
public class MyData { private final String name; public MyData(String name) { this.name = name; } public String getName() { return this.name; } public String toString() { return "[data name : "+this.name + "]"; } }
2 result #
producer 1 put data : [data name : NO:0] count:1 producer 2 put data : [data name : NO:1] count:2 producer 3 put data : [data name : NO:2] count:3 consumer 1 get data : [data name : NO:0] count:2 consumer 2 get data : [data name : NO:1] count:1 consumer 3 get data : [data name : NO:2] count:0 producer 2 put data : [data name : NO:3] count:1 producer 1 put data : [data name : NO:4] count:2 consumer 1 get data : [data name : NO:3] count:1 consumer 1 get data : [data name : NO:4] count:0 producer 3 put data : [data name : NO:5] count:1 producer 2 put data : [data name : NO:6] count:2 consumer 2 get data : [data name : NO:5] count:1 consumer 2 get data : [data name : NO:6] count:0 producer 1 put data : [data name : NO:7] count:1 producer 1 put data : [data name : NO:8] count:2 consumer 3 get data : [data name : NO:7] count:1 producer 2 put data : [data name : NO:9] count:2 consumer 1 get data : [data name : NO:8] count:1 producer 3 put data : [data name : NO:10] count:2 consumer 1 get data : [data name : NO:9] count:1 consumer 2 get data : [data name : NO:10] count:0 producer 1 put data : [data name : NO:11] count:1 consumer 3 get data : [data name : NO:11] count:0 producer 2 put data : [data name : NO:12] count:1 consumer 1 get data : [data name : NO:12] count:0 producer 3 put data : [data name : NO:13] count:1 consumer 3 get data : [data name : NO:13] count:0 consumer 1 start waiting producer 2 put data : [data name : NO:14] count:1 consumer 1 get data : [data name : NO:14] count:0 consumer 2 start waiting producer 1 put data : [data name : NO:15] count:1 consumer 2 get data : [data name : NO:15] count:0 producer 1 put data : [data name : NO:16] count:1 producer 3 put data : [data name : NO:17] count:2 consumer 1 get data : [data name : NO:16] count:1 producer 3 put data : [data name : NO:18] count:2 consumer 1 get data : [data name : NO:17] count:1 producer 1 put data : [data name : NO:19] count:2 producer 2 put data : [data name : NO:20] count:3 consumer 2 get data : [data name : NO:18] count:2 consumer 3 get data : [data name : NO:19] count:1 consumer 1 get data : [data name : NO:20] count:0 producer 3 put data : [data name : NO:21] count:1 producer 1 put data : [data name : NO:22] count:2 producer 2 put data : [data name : NO:23] count:3 producer 1 start waiting consumer 1 get data : [data name : NO:21] count:2 producer 1 put data : [data name : NO:24] count:3 producer 1 start waiting producer 3 start waiting consumer 3 get data : [data name : NO:22] count:2 producer 1 put data : [data name : NO:25] count:3 producer 3 start waiting consumer 2 get data : [data name : NO:23] count:2 producer 3 put data : [data name : NO:26] count:3 producer 2 start waiting consumer 3 get data : [data name : NO:24] count:2 producer 2 put data : [data name : NO:27] count:3 consumer 1 get data : [data name : NO:25] count:2 producer 3 put data : [data name : NO:28] count:3 consumer 1 get data : [data name : NO:26] count:2 producer 2 put data : [data name : NO:29] count:3 producer 1 start waiting consumer 2 get data : [data name : NO:27] count:2 producer 1 put data : [data name : NO:30] count:3 consumer 3 get data : [data name : NO:28] count:2 producer 2 put data : [data name : NO:31] count:3 producer 3 start waiting consumer 2 get data : [data name : NO:29] count:2 producer 3 put data : [data name : NO:32] count:3 consumer 1 get data : [data name : NO:30] count:2 consumer 1 get data : [data name : NO:31] count:1 consumer 1 get data : [data name : NO:32] count:0 consumer 2 start waiting producer 1 put data : [data name : NO:33] count:1 consumer 2 get data : [data name : NO:33] count:0 producer 2 put data : [data name : NO:34] count:1 producer 3 put data : [data name : NO:35] count:2 consumer 3 get data : [data name : NO:34] count:1 producer 3 put data : [data name : NO:36] count:2 consumer 2 get data : [data name : NO:35] count:1 producer 2 put data : [data name : NO:37] count:2 producer 3 put data : [data name : NO:38] count:3 consumer 1 get data : [data name : NO:36] count:2 producer 2 put data : [data name : NO:39] count:3 producer 1 start waiting consumer 1 get data : [data name : NO:37] count:2 producer 1 put data : [data name : NO:40] count:3 producer 1 start waiting consumer 1 get data : [data name : NO:38] count:2 producer 1 put data : [data name : NO:41] count:3 consumer 3 get data : [data name : NO:39] count:2 .........