Mercurial > hg > Members > nobuyasu > tightVNCProxy
view src/myVncProxy/MulticastQueue.java @ 191:b2f0cd0cff6c default tip
Added tag Version-1.0 for changeset 79046b4e5990
author | Yu Taninari <you@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 29 Nov 2011 15:52:44 +0900 |
parents | 1f583d6e0d1a |
children |
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(); item = next.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; } } }