view src/myVncProxy/MulticastQueue.java @ 82:0cbe556e2c54

remove item to reduce memory
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 03 Aug 2011 04:26:58 +0900
parents b2604c5c6a25
children 3f73ebf918bd
line wrap: on
line source

package myVncProxy;

import java.util.concurrent.CountDownLatch;

public class MulticastQueue<T>
{
	
	Node<T> tail;
	
	public MulticastQueue()
	{
		tail = new Node<T>(null);
	}
	
	public synchronized void put(T item)
	{
		Node<T> next = new Node<T>(item);
		tail.set(next);
		tail = next;
	}
	
	public Client<T> newClient()
	{
		return new Client<T>(tail);
	}
	
	static class Client<T>
	{
		Node<T> node;
		
		Client(Node<T> tail)
		{
			node = tail;
		}
		
		public T poll()
		{
			Node<T> next = null;
			T item;
			do {
				try {
					next = node.next();
				}catch(InterruptedException _e){
					_e.printStackTrace();
				}
				item = node.getItem();
				node = next;
			} while ( item == null);
			return item;
		}
	}
	
	static class Node<T>
	{
		private T item;
		private Node<T> next;
		private CountDownLatch latch;
		
		public Node(T item)
		{
			this.item = item;
			this.next = null;
			latch = new CountDownLatch(1);
		}
		
		synchronized public T getItem() {
			return item;
		}

		public void set(Node<T> next)
		{
			this.next = next;
			latch.countDown();
		}
		
		public Node<T> next() throws InterruptedException
		{
			latch.await();
			return next;
		}

		synchronized public void clear() {
			item = null;
		}
	}
}