org.wegra.util.collection
Class BlockingQueue

java.lang.Object
  extended byorg.wegra.util.collection.BlockingQueue

public final class BlockingQueue
extends java.lang.Object

½º·¹µå¿¡ ¾ÈÀüÇÑ Å¥·Î Å¥°¡ ºñ¾îÀÕ´Â »óÅ¿¡¼­ ¿ø¼Ò¸¦ »©³»·Á°í ÇÏ¸é ºí·ÏÅ·µÇ´Â Å¥ÀÌ´Ù. LinkedList ¸¦ ºñ¹ÝÀ¸·Î ÀÛ¼ºµÇ¾î JDK 1.2 Àü ¹öÀü¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿ë·®¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù(Áï, Å¥°¡ °¡µæÂ÷¼­ ºí·ÏÅ· µÇ´Â °æ¿ì´Â ¹ß»ýÇÏÁö ¾Ê´Â´Ù).

Version:
1.0 (2001-08-14)
Author:
wegra(Bok-Youn Lee)

Nested Class Summary
static class BlockingQueue.Test
          Å×½ºÅ©¿ë Ŭ·¡½º
 
Constructor Summary
BlockingQueue()
          Creates a BlockingQueue has unlimited size.
BlockingQueue(int maxSize)
          Creates a BlockingQueue has specific maximum size.
 
Method Summary
 void close()
          ºí·ÏÅ· Å¥ÀÇ »ç¿ëÀ» Á¾·áÇÑ´Ù.
 java.lang.Object dequeue()
          dequeue(long)¿¡ ŸÀӾƿôÀ» wegra.thread.asynch.Lock.TIMEOUT_FOREVER·Î ÁÖ¾î È£ÃâÇÑ´Ù.
 java.lang.Object dequeue(long timeout)
          ¿ø¼Ò¸¦ Å¥·ÎºÎÅÍ Á¦°ÅÇÑ´Ù.
 void enqueue(java.lang.Object element)
          ¿ø¼Ò¸¦ Å¥¿¡ Ãß°¡ÇÑ´Ù.
 void enqueue(java.lang.Object element, long timeout)
          ÆíÀÇ»ó ÀÛ¼ºµÈ ¸Þ¼Òµå·Î enqueue(Object, long, Runnable) ¸Þ¼ÒµåÀÇ onRemoval ÀÎÀÚ°ªÀ» null·Î ÁÖ¾î È£ÃâÇÑ´Ù.
 void enqueue(java.lang.Object element, long timeout, java.lang.Runnable onRemoval)
          ÃÖ´ë "timeout" ¹Ð¸®ÃÊ µ¿¾È Å¥¿¡ ÀÖÀ» ¿ø¼Ò¸¦ Ãß°¡ÇÑ´Ù.
 void enqueueFinal(java.lang.Object element)
          ÀÌ ¸Þ¼Òµå¸¦ ÅëÇØ ¿ø¼Ò°¡ Å¥¿¡ Ãß°¡µÇ°í ³ª¸é ÀÌÈÄ¿¡´Â ¾î¶² ¿ø¼Òµµ Å¥¿¡ Ãß°¡µÇÁö ¸øÇÏ°Ô µÈ´Ù.
 int getWaitingThreadsCount()
          ÇöÀç Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ±â´Ù¸®°í Àִ ťÀÇ °³¼ö¸¦ ¹ÝȯÇÑ´Ù.
 boolean isEmpty()
          [ÁÖÀÇ] ±âº»ÀûÀ¸·Î isEmpty() ¸Þ¼Òµå´Â ¸ÖƼ½º·¹µå ȯ°æ¿¡¼­ ½º·¹µå¿¡ ¾ÈÀüÇÏÁö ¾Ê´Ù.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BlockingQueue

public BlockingQueue()
Creates a BlockingQueue has unlimited size.


BlockingQueue

public BlockingQueue(int maxSize)
Creates a BlockingQueue has specific maximum size.

Parameters:
maxSize - maximum size of queue.
Method Detail

close

public void close()
ºí·ÏÅ· Å¥ÀÇ »ç¿ëÀ» Á¾·áÇÑ´Ù. ÀÌ ¶§ ºí·ÏÅ·µÇ¾î ÀÖ´ø ¸ðµç ½º·¹µåÀÇ ¶ôÀº Ç®¸®°Ô µÈ´Ù. ÀÌÈÄ dequeue() ¸Þ¼Òµå¸¦ È£ÃâÇϸé Á¤»óÀûÀ¸·Î º¹±ÍÇÏ´Â ´ë½Å ClosedQueueException ÀÌ ¹ß»ýÇÑ´Ù. Çѹø Å¥°¡ Á¾·áµÇ°í ³ª¸é enqueue() ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¶§¿¡µµ ¸¶Âù°¡Áö·Î ClosedQueueException ÀÌ ¹ß»ýÇÑ´Ù. Å¥°¡ Á¾·áµÉ ¶§ Å¥´Â ºñ¿öÁö¹Ç·Î Å¥ ¾È¿¡ ÀÖ´ø ¸ðµç °´Ã¼ Áß ¿ÀÁ÷ Å¥°¡ À¯ÀÏÇÏ°Ô ÂüÁ¶Çϰí ÀÖ´ø °´Ã¼¿´´Ù¸é °¡ºñÁö ÄÝ·ºÆÃÀÌ °¡´ÉÇÏ´Ù.


dequeue

public java.lang.Object dequeue()
                         throws java.lang.InterruptedException,
                                ClosedQueueException,
                                TimeoutException
dequeue(long)¿¡ ŸÀӾƿôÀ» wegra.thread.asynch.Lock.TIMEOUT_FOREVER·Î ÁÖ¾î È£ÃâÇÑ´Ù.

Throws:
java.lang.InterruptedException
ClosedQueueException
TimeoutException

dequeue

public java.lang.Object dequeue(long timeout)
                         throws java.lang.InterruptedException,
                                ClosedQueueException,
                                TimeoutException
¿ø¼Ò¸¦ Å¥·ÎºÎÅÍ Á¦°ÅÇÑ´Ù. ÀÌ ¶§ Å¥°¡ ºñ¾îÀÖ´Ù¸é Å¥¿¡ ¹º°¡ Àß ¶§±îÁö ºí·ÏÅ·µÈ´Ù. ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¶§¿¡´Â ÃæÃ¸µÈ ¸ð´ÏÅÍ¿¡ ÀÇÇÑ ±³Âø»óÅ¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù. Áï, ÀÌ ¸Þ¼Òµå¸¦ µ¿±âÈ­µÈ ¸Þ¼Òµå ³»¿¡¼­ ºÎ¸¥ °æ¿ì¶ó¸é ¸Þ¼Òµå ÀÌ¿ÜÀÇ °÷¿¡¼­ Å¥¿¡ ¿ø¼Ò¸¦ Áý¾î³ÖÀ» ¼ö ÀÖ´Â ¹æ¹ýÀÌ Á¦°øµÇ¾î¾ß¸¸ ÇÑ´Ù. ÀáÀçÀûÀÎ °æÀï »óÅÂÀÇ À§Ç輺 ¶§¹®¿¡ ŸÀӾƿôÀº Áö¿øµÇÁö ¾Ê´Â´Ù. (ÀÚ¼¼ÇÑ ³»¿ëÀº Taming Java Threads Ã¥À» Âü°íÇÏÀÚ) ºí·ÏÅ· µÇ¾î ÀÖ´Â ½º·¹µå¶óµµ Thread.interrupt()¸¦ »ç¿ëÇÑ´Ù¸é ºí·ÏÅ·À» Ãë¼ÒÇÒ ¼ö ÀÖ´Ù.

Parameters:
timeout - ¹Ð¸®ÃÊ ´ÜÀ§ÀÇ Å¸ÀӾƿô. ¿µ¿øÈ÷ ±â´Ù¸®°í ½ÍÀ» °æ¿ì¿¡´Â wegra.thead.asynch.Lock.TIMEOUT_FOREVER ³ª Long.MAX_VALUE ¸¦ »ç¿ëÇÏÀÚ.
Returns:
Å¥·ÎºÎÅÍ Á¦°ÅµÈ ¿ø¼Ò¸¦ ¹ÝȯÇϰųª nullÀ» ¹ÝȯÇÑ´Ù. ŸÀӾƿôÀÌ ¹ß»ýÇ߰ųª Á¦°ÅµÈ ¿ø¼Ò°¡ ¾øÀ» °æ¿ì nullÀ» ¹ÝȯÇÑ´Ù.
Throws:
java.lang.InterruptedException - ºí·ÏÅ·µÇ¾î ÀÖÀ» ¶§ ÀÎÅÍ·´Æ®µÇ¸é ¹ß»ýÇÑ´Ù.
wegra.thread.asynch.TimeoutException - ºí¸¯Å·µÇ¾î ÀÖ´Â »óÅ¿¡¼­ ŸÀӾƿôÀÌ °É¸®¸é ¹ß»ýÇÑ´Ù.
ClosedQueueException - Å¥°¡ Á¾·áµÈ »óÅ¿¡¼­ È£ÃâµÇ´Â °æ¿ì ¹ß»ýÇÑ´Ù.
TimeoutException

enqueue

public void enqueue(java.lang.Object element)
             throws ClosedQueueException,
                    QueueOverflowException
¿ø¼Ò¸¦ Å¥¿¡ Ãß°¡ÇÑ´Ù.

Throws:
ClosedQueueException
QueueOverflowException

enqueue

public void enqueue(java.lang.Object element,
                    long timeout)
ÆíÀÇ»ó ÀÛ¼ºµÈ ¸Þ¼Òµå·Î enqueue(Object, long, Runnable) ¸Þ¼ÒµåÀÇ onRemoval ÀÎÀÚ°ªÀ» null·Î ÁÖ¾î È£ÃâÇÑ´Ù.


enqueue

public void enqueue(java.lang.Object element,
                    long timeout,
                    java.lang.Runnable onRemoval)
ÃÖ´ë "timeout" ¹Ð¸®ÃÊ µ¿¾È Å¥¿¡ ÀÖÀ» ¿ø¼Ò¸¦ Ãß°¡ÇÑ´Ù. ÀÎÀÚ·Î ÁÖ¾îÁø onRemoval °´Ã¼ÀÇ run() ¸Þ¼Òµå´Â ¿ø¼Ò°¡ Å¥·ÎºÎÅÍ Á¦°ÅµÇ¸é È£ÃâµÈ´Ù. ¸¸¾à ¾î¶² ¿ì³Ó°ú ÇÑ ¹ø ÀÌ»ó Ãß°¡µÉ °æ¿ì ¸ÕÀú Ãß°¡µÇ¾ú´ø ¿ø¼Ò´Â Á¦°ÅµÈ´Ù.

Parameters:
element - Ãß°¡µÉ ¿ø¼Ò
timeout - ¿ø¼Ò°¡ Å¥¿¡ ÃÖ´ë·Î ÀÖÀ» ¼ö ÀÖ´Â ½Ã°£. (´õ ³ôÀº ¿ì¼± ¼øÀ§ÀÇ ½º·¹µå°¡ ½ÇÇà ÁßÀÎ °æ¿ì¿¡´Â ŸÀӾƿôÀÌ ¹ß»ýÇÏ´Â ½Ã°£Àº Á¤È®ÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù)
onRemoval - null·Î ÁöÁ¤µÇÁö ¾ÊÀº °æ¿ì ¿ø¼Ò°¡ ŸÀӾƿô¿¡ ÀÇÇØ Å¥·ÎºÎÅÍ Á¦°ÅµÉ ¶§ ÀÌ °´Ã¼ÀÇ run() ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.

enqueueFinal

public void enqueueFinal(java.lang.Object element)
                  throws ClosedQueueException
ÀÌ ¸Þ¼Òµå¸¦ ÅëÇØ ¿ø¼Ò°¡ Å¥¿¡ Ãß°¡µÇ°í ³ª¸é ÀÌÈÄ¿¡´Â ¾î¶² ¿ø¼Òµµ Å¥¿¡ Ãß°¡µÇÁö ¸øÇÏ°Ô µÈ´Ù. Ãß°¡µÈ ¸ðµç ¿ø¼Ò°¡ Å¥·ÎºÎÅÍ ºüÁ®³ª°¡°í ³ª¸é Å¥´Â ÀÚµ¿À¸·Î Á¾·áµÈ´Ù.

Throws:
ClosedQueueException

getWaitingThreadsCount

public int getWaitingThreadsCount()
ÇöÀç Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ±â´Ù¸®°í Àִ ťÀÇ °³¼ö¸¦ ¹ÝȯÇÑ´Ù. µ¿±âÈ­¿Í °ü·ÃÇÏ¿© isEmpty() ¿Í ºñ½ÁÇÑ ¹®Á¦Á¡À» °¡Áö°í ÀÖÀ¸¹Ç·Î ÁÖÀÇÇØ¼­ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.


isEmpty

public boolean isEmpty()
[ÁÖÀÇ] ±âº»ÀûÀ¸·Î isEmpty() ¸Þ¼Òµå´Â ¸ÖƼ½º·¹µå ȯ°æ¿¡¼­ ½º·¹µå¿¡ ¾ÈÀüÇÏÁö ¾Ê´Ù. ´ÙÀ½°ú °°Àº ÄÚµå¶ó¸é Å×½ºÆ®¸¦ ¸¶Ä£ ÈÄ ¾ÆÁ÷ Å¥¿¡¼­ ¿ø¼Ò¸¦ Á¦°ÅÇÏÁö ¾ÊÀº »óÅ¿¡¼­ ´Ù¸¥ ½º·¹µå¿¡°Ô Á¦¾î±ÇÀÌ ³Ñ¾î°¡¼­ ¸ÕÀú ¿ø¼Ò¸¦ Á¦°ÅÇØ¹ö¸± ¼öµµ ÀÖ´Ù.
	BlockingQueue queue = new BlockingQueue();
	//...
	if ( !queue.isEmptyt() ) {
		queue.dequeue();
	}
 
µû¶ó¼­, ½º·¹µå¿¡ ¾ÈÀüÇϱâ À§Çؼ­´Â À§ÀÇ Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
	BlockingQueue quque = new BlockingQueue();
	//...
	synchronized( queue ) {
		if ( queue.isEmpty() ) {
			queue.dequeue();
		}
	}
	
À§ÀÇ ÄÚµå¿Í °°ÀÌ Çϸé Å×½ºÆ®¿Í Å¥¿¡¼­ ¿ø¼Ò¸¦ »©³»´Â ÀÛ¾÷ÀÌ Â÷·ÊÂ÷·Ê ÀϾ´Ù.