view src/myVncProxy/MulticastQueue.java @ 145:8bdbed4c4505

add template.txt
author e085711
date Mon, 05 Sep 2011 06:03:14 +0900
parents 7e60020f0a72
children db5f735fd2b4
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;
		}
		
		synchronized public T poll()
		{
			Node<T> next = null;
			T item = null;
			do {
				try {
					next = node.next();
				}catch(InterruptedException _e){
					continue;
				}
				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;
		}
	}
}