producer consumer pattern example

Contents

1 src
1.1 MyTest.java
1.2 Producer.java
1.3 Consumer.java
1.4 MyQueue.java
1.5 MyData.java
2 result

1 src #

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
.........
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-08-27 17:32:32
Processing time 0.1886 sec