|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
ÀÌÀü Ŭ·¡½º ´ÙÀ½ Ŭ·¡½º | ÇÁ·¹ÀÓÀ¸·Î ÇÁ·¹ÀÓ ¾øÀÌ | |||||||||
°³¿ä: NESTED | Çʵå | constructor | ¸Þ¼µå | »ó¼¼: Çʵå | »ý¼ºÀÚ | ¸Þ¼µå |
java.lang.Objectjava.util.concurrent.Semaphore
public class Semaphore
Ä«¿îÆ®¿¡ »ç¿ëµÇ´Â semaphore. °³³äÀûÀ¸·Î´Â semaphore´Â Çã°¡ ¼¼Æ®¸¦ °ü¸®ÇÕ´Ï´Ù. °¢ acquire()
´Â
ÇÊ¿äÇÏ°Ô ÀÀÇØ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö ºí·ÏÀ» ½ÇÇàÇØ, ÀÌ¿ë °¡´ÉÇÏ°Ô µÇ¸é ±×°ÍÀ» ÃëµæÇÕ´Ï´Ù. °¢ release()
´Â ÆÄ ¹ÌÆ®¸¦ Ãß°¡ÇÕ´Ï´Ù¸¸, ±× ¶§ ºí·Ï ÃëµæÀÚ¸¦ ÇØ¹æÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ´Ù¸¸, ½ÇÁ¦ÀÇ ÆÄ ¹ÌÆ® °´Ã¼´Â »ç¿ëµÇÁö ¾Ê½À´Ï´Ù. Semaphore´Â ÀÌ¿ë °¡´ÉÇÑ ¼öÀÇ Ä«¿îÆ®¸¦ À¯ÁöÇØ, °Å±â¿¡ ÀÀÇØ µ¿ÀÛÇÒ »ÓÀÔ´Ï´Ù.
semaphore´Â ÀϺÎÀÇ (¹°¸® ¶Ç´Â ³í¸®) ÀÚ¿ø¿¡ ¾×¼¼½º °¡´ÉÇÑ threadÀÇ ¼ö¸¦ Á¦ÇÑÇÏ´Â °æ¿ì¿¡ ÀÚÁÖ »ç¿ëµË´Ï´Ù. ¿¹¸¦ µé¾îÀÌÇÏ¿¡ ³ªÅ¸³»´Â Ŭ·¡½º´Â Ç׸ñÀÇ Ç®¿¡ÀÇ ¾×¼¼½º Á¦¾î¿¡ semaphore¸¦ »ç¿ëÇÕ´Ï´Ù.
class Pool { private static final MAX_AVAILABLE = 100; private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); public Object getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } public void putItem(Object x) { if (markAsUnused(x)) available.release(); } // Not a particularly efficient data structure; just for demo protected Object[] items = ... whatever kinds of items being managed protected boolean[] used = new boolean[MAX_AVAILABLE]; protected synchronized Object getNextAvailableItem() { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (! used[i]) { used[i] = true; return items[i]; } } return null; // not reached } protected synchronized boolean markAsUnused(Object item) { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (item == items[i]) { if (used[i]) { used[i] = false; return true; } else return false; } } return false; } }
Ç׸ñÀ» ÃëµæÇϱâ Àü¿¡
°¢ thread´Â semaphore·ÎºÎÅÍ Ç׸ñÀÌ »ç¿ë °¡´ÉÇÑ °ÍÀ» º¸ÁõÇÏ´Â ÆÄ ¹ÌÆ®¸¦ ÃëµæÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. Ç׸ñ 󸮰¡ ¿Ï·áÇϸé thread´Â Ç®·Î µ¹¾Æ°¡ ÆÄ ¹ÌÆ®°¡ semaphore¿¡ µ¹·ÁÁÖ°íÁ® ´Ù¸¥ thread°¡ Ç׸ñÀ» ÃëµæÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. acquire()
È£Ãâ½Ã¿¡ µ¿±â ¶ôÀº º¸°ü À¯ÁöµÇÁö ¾Ê½À´Ï´Ù. µ¿±â ¶ôÀÌ º¸°ü À¯ÁöµÇ¸é, Ç׸ñÀ» Ç®¿¡ µ¹·ÁÁÙ ¼ö°¡ ¾ø°Ô µÇ±â ¶§¹®¿¡ÀÔ´Ï´Ù. semaphore´Â Ç®¿¡ÀÇ ¾×¼¼½º Á¦ÇÑÀ¸·Î ÇÊ¿äÇÑ µ¿±â¸¦, Ç® ÀÚüÀÇ Àϰü¼º À¯Áö¿¡ ÇÊ¿äÇÑ µ¿±â¿Í´Â º°°³¿¡ ĸ½¶ÈÇÕ´Ï´Ù.
semaphore´Â ÃʱâȵǸé, ÆÄ ¹ÌÆ®¸¦ ÃÖ´ë 1°³
»ç¿ë °¡´ÉÇÏ°Ô Çϱâ À§ÇÑ, »óÈ£ ¹èŸ ¶ôÀ¸·Î¼ ±â´ÉÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù. À̰ÍÀº 1°³ÀÇ ÆÄ ¹ÌÆ®¸¦ »ç¿ë °¡´ÉÇÏ°Ô ÇÏ´Â »óÅÂ¿Í Á¦·ÎÀÇ ÆÄ ¹ÌÆ®¸¦ »ç¿ë °¡´ÉÇÏ°Ô ÇÏ´Â »óÅÂÀÇ 2°³
¸¸À» º¸°ü À¯ÁöÇϱâ À§ÇØ, ÀϹÝÀûÀ¸·Î´Â ¡¸¹ÙÀ̳ʸ® semaphore¡¹·Î¼ ¾Ë·ÁÁ® ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î »ç¿ëµÇ´Â °æ¿ì, ¹ÙÀ̳ʸ® semaphore´Â (¸¹Àº Lock
±¸Çö°ú´Â ´Þ¶ó) ¡¸¶ô¡¹À» ¼ÒÀ¯ÀÚ ÀÌ¿ÜÀÇ thread¿¡ ÀÇÇØ ÇØ¹æ °¡´ÉÇÏ´Ù¶ó°í ¸»ÇÏ´Â ÇÁ·ÎÆÛƼ¸¦ º¸°ü À¯ÁöÇÕ´Ï´Ù (semaphore¿¡´Â ¼ÒÀ¯±ÇÀ̶ó°í ÇÏ´Â °³³äÀÌ ¾ø±â ¶§¹®¿¡). À̰ÍÀº µ¥µå ·ÏÀÇ º¹¿ø µî, ÀϺÎÀÇ Æ¯¼öÇÑ ÄÁÅØ½ºÆ®¿¡ ¼´Â À¯¿ëÇÕ´Ï´Ù.
ÀÌ Å¬·¡½ºÀÇ »ý¼ºÀÚ´Â ¿É¼ÇÀ¸·Î fairness ÆÄ¶ó¹ÌÅ͸¦ ¹Þ¾ÆµéÀÔ´Ï´Ù. À̰ÍÀ» false ·Î ¼³Á¤Çϸé, ÀÌ Å¬·¡½º´Â thread°¡ ÆÄ ¹ÌÆ®¸¦ ¾ò´Â Â÷·Ê¸¦ º¸ÁõÇÏÁö ¾Ê½À´Ï´Ù. ƯÈ÷, ¡¸¹Ù¡¡¹ÀÌ Çã°¡µË´Ï´Ù. À̰ÍÀº, acquire()
¸¦
È£ÃâÇÏ´Â thread°¡ ´ë±âÇϰí ÀÖ´ø thread¿¡ ¾Õ¼ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´Â °ÍÀ»ÀǹÌÇÕ´Ï´Ù. ³í¸®ÀûÀ̰Դ »õ·Î¿î (ºÐ)ÆíÀÇ thread°¡ ´ë±âÁßÀÇ threadÀÇ Å¥ÀÇ ¼±µÎ¿¡ ¹èÄ¡µÇ°Ô µË´Ï´Ù. fairness°¡ true ·Î ¼³Á¤µÇ¸é, semaphore´Â ¸î°³ÀÇ Ãëµæ
¸Þ¼µå¸¦ È£ÃâÇÏ´Â thread°¡ ÀÌ·¯ÇÑ ¸Þ¼µå°¡ 󸮵Ǵ Â÷·Ê (¼±ÀÔó ¹æÆí; FIFO)·Î ÆÄ ¹ÌÆ®¸¦ ÃëµæÇϵµ·Ï ¼±ÅõǴ °ÍÀ» º¸ÁõÇÕ´Ï´Ù. FIFO ¼ø¼´Â ÇÊ¿¬ÀûÀ¸·Î ÀÌ·¯ÇÑ ¸Þ¼µå³»ÀÇ Æ¯Á¤ÀÇ ³»ºÎ ½ÇÇà Æ÷ÀÎÆ®¿¡ Àû¿ëµË´Ï´Ù. ÀÌ ¶§¹®¿¡
¾î´À thread°¡ ´Ù¸¥ threadº¸´Ù Àü¿¡ acquire¸¦ È£ÃâÇÏÁö¸¸, ´Ù¸¥ threadº¸´Ù ÈÄ¿¡ ¼ø¼ Æ÷ÀÎÆ®¿¡ À̸£´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ¶Ç, ¸Þ¼µå·ÎºÎÅÍÀÇ º¹±Í½Ã¿¡ °°Àº ÀÏÀÌ ÀϾ °¡´É¼ºµµ ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ½Ã°£ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀº tryAcquire
¸Þ¼µå´Â ±Õµî ¼³Á¤À» Á¸ÁßÇÕ´Ï´Ù¸¸, »ç¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®´Â ¹Þ¾ÆµéÀÔ´Ï´Ù.
º¸Åë, ÀÚ¿ø¿¡ÀÇ ¾×¼¼½º Á¦¾î¿¡ »ç¿ëÇÏ´Â semaphore´Â ±Õµî¼ºÀ» À¯ÁöÇϵµ·Ï ÃʱâÈÇØ, ÀÚ¿ø¿¡ÀÇ ¾×¼¼½º°¡ °ï¶õÇÏ°Ô µÇ´Â thread°¡ Á¸ÀçÇÏÁö ¾Ê°Ô ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ´Ù¸¥ Á¾·ùÀÇ µ¿±â Á¦¾î·Î semaphore¸¦ »ç¿ëÇÏ´Â °æ¿ì, ºñ±ÕµîÀÇ ¼ø¼ºÎ¿¡ ÇÑ throughputÀÇ ÀÌÁ¡ÀÌ ±Õµî¼ºÀÇ °í·Áº¸´Ù ÀÚÁÖ Áß¿äÇÏ°Ô µË´Ï´Ù.
ÀÌ Å¬·¡½º´Â ÇÑ ¹ø¿¡ º¹¼öÀÇ ÆÄ ¹ÌÆ®¸¦Ãëµæ
¹×ÇØ¹æ
Çϱâ À§ÇÑ Æí¸®ÇÑ ¸Þ¼µåµµ Á¦°øÇÕ´Ï´Ù. ±Õµî¼ºÀ» true ·Î ¼³Á¤ÇÏÁö ¾Ê°í ÀÌ·¯ÇÑ ¸Þ¼µå¸¦ »ç¿ëÇÏ´Â °æ¿ì, ¹«Á¦ÇÑÇÏ°Ô ¿¬±âµÇ´Â À§ÇèÀÌ ´Ã¾î³ª´Â °Í¿¡ À¯ÀÇÇØ ÁÖ¼¼¿ä.
»ý¼ºÀÚ °³¿ä | |
---|---|
Semaphore (int permits)
ÁöÁ¤µÈ ¼öÀÇ ÆÄ ¹ÌÆ® ¹× ºñ±Õµî ¼³Á¤À» »ç¿ëÇØ Semaphore¸¦ ÀÛ¼ºÇÕ´Ï´Ù. |
|
Semaphore (int permits,
boolean fair)
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ® ¹× ÁöÁ¤µÈ ±Õµî ¼³Á¤À» »ç¿ëÇØ Semaphore¸¦ ÀÛ¼ºÇÕ´Ï´Ù. |
¸Þ¼µå °³¿ä | |
---|---|
void |
acquire ()
ÀÌ semaphore·ÎºÎÅÍ ÆÄ ¹ÌÆ®¸¦ ÃëµæÇØ, ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö ºí·ÏÀ» ½ÇÇàÇÕ´Ï´Ù. |
void |
acquire (int permits)
ÀÌ semaphore·ÎºÎÅÍ ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®¸¦ ÃëµæÇØ, ¸ðµç °ÍÀÌ ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö ºí·ÏÀ» ½ÇÇàÇÕ´Ï´Ù. |
void |
acquireUninterruptibly ()
ÀÌ semaphore·ÎºÎÅÍ ÆÄ ¹ÌÆ®¸¦ ÃëµæÇÕ´Ï´Ù. |
void |
acquireUninterruptibly (int permits)
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®¸¦ ÀÌ semaphore·ÎºÎÅÍ ÃëµæÇØ, ¸ðµç °ÍÀÌ ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö ºí·Ï ÇÕ´Ï´Ù. |
int |
availablePermits ()
ÀÌ semaphore·Î ÀÌ¿ë °¡´ÉÇÑ ÇöÀçÀÇ ÆÄ ¹ÌÆ®¼ö¸¦ ¸®ÅÏÇÕ´Ï´Ù. |
int |
drainPermits ()
°ð¹Ù·Î ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®¸¦ ¸ðµÎ ÃëµæÇØ µ¹·ÁÁØ´Ù |
protected Collection <Thread > |
getQueuedThreads ()
ÃëµæÀ» ´ë±âÇϰí ÀÖ´Â thread¸¦ Æ÷ÇÔÇÑ Ä÷º¼ÇÀ» ¸®ÅÏÇÕ´Ï´Ù. |
int |
getQueueLength ()
ÃëµæÀ» ´ë±âÁßÀÇ threadÀÇ ÃßÁ¤¼ö¸¦ ¸®ÅÏÇÕ´Ï´Ù. |
boolean |
hasQueuedThreads ()
ÃëµæÀ» ´ë±âÁßÀÇ thread°¡ Á¸ÀçÇÒÁö ¾î¶³Áö¸¦ Á¶È¸ÇÕ´Ï´Ù. |
boolean |
isFair ()
ÀÌ semaphore·Î ±Õµî¼ºÀÌ true ·Î ¼³Á¤µÇ¾î ÀÖ´Â °æ¿ì´Â true¸¦ ¸®ÅÏÇÕ´Ï´Ù. |
protected void |
reducePermits (int reduction)
ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦, ÁöÁ¤µÈ ¼ö¸¸Å ÁÙÀÔ´Ï´Ù. |
void |
release ()
ÆÄ ¹ÌÆ®¸¦ ÇØ¹æÇØ semaphore¿¡ ¸®ÅÏÇÕ´Ï´Ù. |
void |
release (int permits)
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®¸¦ ÇØ¹æÇØ, semaphore¿¡ ¸®ÅÏÇÕ´Ï´Ù. |
String |
toString ()
ÀÌ semaphore ¹× ±× »óŸ¦ ½Äº°Çϴ ij¸¯ÅÍ ¶óÀÎÀ» ¸®ÅÏÇÕ´Ï´Ù. |
boolean |
tryAcquire ()
È£Ãâ½Ã¿¡ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì¿¡°Ô¸¸, ÀÌ semaphore·ÎºÎÅÍ ÆÄ ¹ÌÆ®¸¦ ÃëµæÇÕ´Ï´Ù. |
boolean |
tryAcquire (int permits)
È£Ãâ½Ã·Î ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®¸¦ ¸ðµÎ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì¿¡°Ô¸¸, ÆÄ ¹ÌÆ®¸¦ ÀÌ semaphore·ÎºÎÅÍ ÃëµæÇÕ´Ï´Ù. |
boolean |
tryAcquire (int permits,
long timeout,
TimeUnit unit)
ÁöÁ¤µÈ ´ë±â ½Ã°£³»·Î ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®°¡ ¸ðµÎ ÀÌ¿ë °¡´ÉÇÏ°Ô µÇ¾î, ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ® °¡ ¹ß»ýÇϰí ÀÖÁö ¾Ê´Â °æ¿ì¿¡
±×·¯ÇÑ ÆÄ ¹ÌÆ®¸¦ ÀÌ semaphore·ÎºÎÅÍ ÃëµæÇÕ´Ï´Ù. |
boolean |
tryAcquire (long timeout,
TimeUnit unit)
ÁöÁ¤µÈ ´ë±â ½Ã°£³»¿¡ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÏ°Ô µÇ¾î, ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ® °¡ ¹ß»ýÇϰí ÀÖÁö ¾Ê´Â °æ¿ì¿¡
ÀÌ semaphore·ÎºÎÅÍ ÆÄ ¹ÌÆ®¸¦ ÃëµæÇÕ´Ï´Ù. |
Ŭ·¡½º java.lang. Object ·ÎºÎÅÍ »ó¼ÓµÈ ¸Þ¼µå |
---|
clone,
equals,
finalize,
getClass,
hashCode,
notify,
notifyAll,
wait,
wait,
wait |
»ý¼ºÀÚ »ó¼¼ |
---|
public Semaphore(int permits)
permits
- »ç¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ Ãʱâ¼ö. À̰ÍÀº À߸øµÈ °ª
À¸·Î ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. °ªÀÌ ºÎÀÇ °æ¿ì, ¾î´À ÃëµæÀÌ Çã°¡µÇ´Â °Íº¸´Ùµµ Àü¿¡ ÇØ¹æÀ» ½Ç½ÃÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. public Semaphore(int permits, boolean fair)
permits
- »ç¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ Ãʱâ¼ö. À̰ÍÀº À߸øµÈ °ª
À¸·Î ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. °ªÀÌ ºÎÀÇ °æ¿ì, ¾î´À ÃëµæÀÌ Çã°¡µÇ´Â °Íº¸´Ùµµ Àü¿¡ ÇØ¹æÀ» ½Ç½ÃÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. fair
- °æÇÕÀÇ ¹ß»ý½Ã¿¡ ÀÌ semaphore°¡ ¼±ÀÔó ¹æÆíÀÇ ÆÄ ¹ÌÆ® Çã°¡¸¦ º¸ÁõÇÏ´Â °æ¿ì´Â true, ±×·¸Áö ¾ÊÀº °æ¿ì´Â false¸Þ¼µåÀÇ »ó¼¼ |
---|
public void acquire() throws InterruptedException
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇÕ´Ï´Ù.
ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì´Â ±×°ÍÀ» ÃëµæÇØ Áï½Ã º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ 1°³ ÁÙÀÔ´Ï´Ù.
ÆÄ ¹ÌÆ®¸¦ ÀÌ¿ëÇÒ ¼ö ¾ø´Â °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 2°³ Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
release()
¸Þ¼µå¸¦ È£ÃâÇØ, ÇöÀçÀÇ thread°¡ ´ÙÀ½¿¡ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇÑ´Ù ÇöÀçÀÇ thread·Î
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇßÀ» °æ¿ì,
InterruptedException
ÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® ½ºÅ×ÀÌÅͽº°¡ Ŭ¸®¾î µË´Ï´Ù.
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ìThread.interrupt()
public void acquireUninterruptibly()
ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì´Â ±×°ÍÀ» ÃëµæÇØ Áï½Ã º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ 1°³ ÁÙÀÔ´Ï´Ù.
ÆÄ ¹ÌÆ®¸¦ ÀÌ¿ëÇÒ ¼ö ¾ø´Â °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ¹«È¿°¡ µÇ¾î, ´Ù¸¥ thread°¡ ÀÌ semaphore¿¡ ´ëÇØ¼ release()
¸Þ¼µå¸¦ È£ÃâÇØ, ´ÙÀ½¿¡ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´Â °ÍÀÌ ÇöÀçÀÇ thread°¡ µÉ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
ÆÄ ¹ÌÆ®ÀÇ ´ë±âÁß¿¡ ÇöÀçÀÇ thread·ÎÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇßÀ» °æ¿ì, ´ë±â´Â ¼ÓÇàµË´Ï´Ù¸¸, thread°¡ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖÀ» ¶§´Â ÆÄ ¹ÌÆ®·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏÁö ¾Ê¾Ò´ø °æ¿ì¿¡ ¹ÞÀ» ¶§¿Í´Â ´Ù¸¥ °æ¿ì°¡ ÀÖ½À´Ï´Ù. thread°¡ ¸Þ¼µå·ÎºÎÅÍ º¹±ÍÇÒ ¶§¿¡
ÀÎÅÍ·´Æ® »óŰ¡ ¼³Á¤µË´Ï´Ù.
public boolean tryAcquire()
ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì´Â ±×°ÍÀ» ÃëµæÇØ, °ª true·Î Áï½Ã º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ 1°³ ÁÙÀÔ´Ï´Ù.
ÆÄ ¹ÌÆ®¸¦ ÀÌ¿ëÇÒ ¼ö ¾ø´Â °æ¿ì, ÀÌ ¸Þ¼µå´Â °ª false·Î Áï½Ã º¹±ÍÇÕ´Ï´Ù.
ÀÌ semaphore°¡ ±Õµî ¼ø¼ºÎ Á¤Ã¥¸¦ »ç¿ëÇϵµ·Ï ¼³Á¤µÇ¾î ÀÖ´Â °æ¿ì¿¡¼µµ, ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇϸé, ´Ù¸¥ thread°¡ ÇöÀç, ´ë±âÁßÀÏÁö ¾î¶³Áö¿¡ °ü°è¾øÀÌ, tryAcquire()
È£Ãâ¿¡ ÀÇÇØ Áï½Ã ±×°ÍÀ» ÃëµæÇÕ´Ï´Ù. ÀÌ ¡¸¹Ù¡¡¹µ¿ÀÛÀº ±Õµî¼ºÀ» ÇØÄ£´Ù°í ÇØµµ, ƯÁ¤ÀÇ »óȲÀ¸·Î À¯¿ëÇÑ °ÍÀÌ µË´Ï´Ù. ±Õµî ¼³Á¤À» Áß½ÃÇÏ´Â °æ¿ì, °ÅÀÇ µî°¡ÀÎ tryAcquire(0, TimeUnit.SECONDS)
¸¦
»ç¿ëÇØ ÁÖ¼¼¿ä (À̰͵µ ÀÎÅÍ·´Æ®¸¦ °ËÃâÇÑ´Ù).
public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇϰí ÀÖÁö ¾Ê´Â °æ¿ì¿¡
ÀÌ semaphore·ÎºÎÅÍ ÆÄ ¹ÌÆ®¸¦ ÃëµæÇÕ´Ï´Ù.
ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì´Â ±×°ÍÀ» ÃëµæÇØ, °ª true·Î Áï½Ã º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ 1°³ ÁÙÀÔ´Ï´Ù.
ÆÄ ¹ÌÆ®¸¦ ÀÌ¿ëÇÒ ¼ö ¾ø´Â °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 3 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
release()
¸Þ¼µå¸¦ È£ÃâÇØ, ÇöÀçÀÇ thread°¡ ´ÙÀ½¿¡ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇÑ´Ù ÆÄ ¹ÌÆ®°¡ ÃëµæµÇ¸é, °ª true°¡ ¸®Åϵ˴ϴ٠.
ÇöÀçÀÇ thread·Î
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇßÀ» °æ¿ì,
InterruptedException
ÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® ½ºÅ×ÀÌÅͽº°¡ Ŭ¸®¾î µË´Ï´Ù.
ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇϸé, °ª false°¡ ¸®Åϵ˴ϴ٠. ½Ã°£ÀÌ Á¦·Î ¶Ç´Â ±×°Íº¸´Ù ÀÛÀº °æ¿ì, ¸Þ¼µå´Â ´ë±âÇÏÁö ¾Ê½À´Ï´Ù.
timeout
- ÆÄ ¹ÌÆ®ÀÇ ÃÖÀå ´ë±â ½Ã°£unit
- timeout ÀμöÀÇ ½Ã°£ ´ÜÀ§
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ìThread.interrupt()
public void release()
ÆÄ ¹ÌÆ®¸¦ ÇØ¹æÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ 1 ´Ã¸³´Ï´Ù. ¸î°³ÀÇ thread°¡ ÆÄ ¹ÌÆ®ÀÇ ÃëµæÀ» ½ÃµµÇÏ´Â °æ¿ì, ±×°ÍÀÌ ¼±ÅõǾî ÇØ¹æµÈÁö ¾ó¸¶ ¾ÈµÈ ÆÄ ¹ÌÆ®°¡ ÁÖ¾îÁý´Ï´Ù. ±× thread´Â thread ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ÀçÂ÷ À¯È¿ÇÏ°Ô µË´Ï´Ù.
ÆÄ ¹ÌÆ®¸¦ ÇØ¹æÇÏ´Â thread°¡acquire()
¸¦
È£ÃâÇØ ÆÄ ¹ÌÆ®¸¦ ÃëµæÀÌ ³¡³ »óÅÂÀÏ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. semaphoreÀÇ ÀûÁ¤ÇÑ »ç¿ë¹ýÀº ¾îÇø®ÄÉÀ̼ÇÀÇ ÇÁ·Î±×·¡¹Ö ±Ô¾à¿¡ ÀÇÇØ È®¸³µË´Ï´Ù.
public void acquire(int permits) throws InterruptedException
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇÕ´Ï´Ù.
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì¿¡ ±×°ÍÀ» ÃëµæÇØ, Áï½Ã º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ ÁöÁ¤¼ö¸¸Å ÁÙÀÔ´Ï´Ù.
ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö°¡ ºÎÁ·ÇÑ °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 2°³ Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
release
¸Þ¼µåÀÇ ¾î´ÀÂÊÀ̵çÀ» È£ÃâÇØ, ´ÙÀ½¿¡ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´Â °ÍÀÌ ÇöÀçÀÇ thread·Î ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö°¡ ÀÌ ¿ä±¸¸¦ ä¿î´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇÑ´Ù ÇöÀçÀÇ thread·Î
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇßÀ» °æ¿ì,
InterruptedException
ÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® »óŰ¡ Ŭ¸®¾î µË´Ï´Ù. ÀÌ thread¿¡ ÇÒ´çÇÒ ¼ö ÀÖ¾î¾ßÇÒ ÆÄ ¹ÌÆ®´Â release()
È£Ãâ·Î ÀÌ¿ë °¡´ÉÇÏ°Ô µÇ¾ú´ÂÁö¿Í °°ÀÌ, ÆÄ ¹ÌÆ®ÀÇ ÃëµæÀ» ½ÃµµÇÏ´Â ´Ù¸¥ thread¿¡ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù.
permits
- ¾ò´Â ÆÄ ¹ÌÆ®ÀÇ ¼ö
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì
IllegalArgumentException
- ÆÄ ¹ÌÆ®°¡ Á¦·Î ¹Ì¸¸ÀÇ °æ¿ìThread.interrupt()
public void acquireUninterruptibly(int permits)
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì¿¡ ±×°ÍÀ» ÃëµæÇØ, Áï½Ã º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ ÁöÁ¤¼ö¸¸Å ÁÙÀÔ´Ï´Ù.
ÃæºÐÇÑ ¼öÀÇ ÆÄ ¹ÌÆ®¸¦ ÀÌ¿ëÇÒ ¼ö ¾ø´Â °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ¹«È¿°¡ µË´Ï´Ù. ±× ÈÄ, ´Ù¸¥ thread°¡ ÀÌ semaphore¿¡ ´ëÇØ¼ release
¸Þ¼µåÀÇ ¾î´ÀÂÊÀ̵çÀ» È£ÃâÇØ, ´ÙÀ½¹ø ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´Â °ÍÀÌ ÇöÀçÀÇ thread·Î ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö°¡ ÀÌ ¿ä±¸¸¦ ä¿ï ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
ÆÄ ¹ÌÆ®ÀÇ ´ë±âÁß¿¡ ÇöÀçÀÇ thread·ÎÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇÏ´Â °æ¿ì, ´ë±â´Â °è¼ÓµÇ¾î Å¥³»ÀÇ À§Ä¡´Â ¿µÇâÀ» ¹ÞÁö ¾Ê½À´Ï´Ù. thread°¡ ÀÌ ¸Þ¼µå·ÎºÎÅÍ º¹±ÍÇÒ ¶§, ÀÎÅÍ·´Æ® »óŰ¡ ¼³Á¤µË´Ï´Ù.
permits
- ¾ò´Â ÆÄ ¹ÌÆ®ÀÇ ¼ö
IllegalArgumentException
- ÆÄ ¹ÌÆ®°¡ Á¦·Î ¹Ì¸¸ÀÇ °æ¿ìpublic boolean tryAcquire(int permits)
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì¿¡ ±×°ÍÀ» ÃëµæÇØ, Áï½Ã true·Î º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ ÁöÁ¤¼ö¸¸Å ÁÙÀÔ´Ï´Ù.
ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö°¡ ºÒÃæºÐÇÑ °æ¿ì, ÀÌ ¸Þ¼µå´Â °ª false·Î Áï½Ã º¹±ÍÇÕ´Ï´Ù. ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö´Â º¯ÈÇÏÁö ¾Ê½À´Ï´Ù.
ÀÌ semaphore°¡ ±Õµî ¼ø¼ºÎ Á¤Ã¥¸¦ »ç¿ëÇϵµ·Ï ¼³Á¤µÇ¾î ÀÖ´Â °æ¿ì¿¡¼µµ, ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇϸé, ´Ù¸¥ thread°¡ ´ë±âÁßÀÏÁö ¾î¶³Áö¿¡ °ü°è¾øÀÌ, tryAcquire
È£Ãâ¿¡ ÀÇÇØ Áï½Ã ±×°ÍÀ» ÃëµæÇÕ´Ï´Ù. ÀÌ ¡¸¹Ù¡¡¹µ¿ÀÛÀº ±Õµî¼ºÀ» ÇØÄ£´Ù°í ÇØµµ, ƯÁ¤ÀÇ »óȲÀ¸·Î À¯¿ëÇÑ °ÍÀÌ µË´Ï´Ù. ±Õµî ¼³Á¤À» Áß½ÃÇÏ´Â °æ¿ì, °ÅÀÇ µî°¡ÀÎ tryAcquire(permits, 0, TimeUnit.SECONDS)
¸¦
»ç¿ëÇØ ÁÖ¼¼¿ä (À̰͵µ ÀÎÅÍ·´Æ®¸¦ °ËÃâÇÑ´Ù).
permits
- ¾ò´Â ÆÄ ¹ÌÆ®ÀÇ ¼ö
IllegalArgumentException
- ÆÄ ¹ÌÆ®°¡ Á¦·Î ¹Ì¸¸ÀÇ °æ¿ìpublic boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇϰí ÀÖÁö ¾Ê´Â °æ¿ì¿¡
±×·¯ÇÑ ÆÄ ¹ÌÆ®¸¦ ÀÌ semaphore·ÎºÎÅÍ ÃëµæÇÕ´Ï´Ù.
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÑ °æ¿ì¿¡ ±×°ÍÀ» ÃëµæÇØ, Áï½Ã °ª true·Î º¹±ÍÇØ, ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö¸¦ ÁöÁ¤¼ö¸¸Å ÁÙÀÔ´Ï´Ù.
ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö°¡ ºÎÁ·ÇÑ °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ °üÇØ¼ ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 3 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
release
¸Þ¼µåÀÇ ¾î´ÀÂÊÀ̵çÀ» È£ÃâÇØ, ´ÙÀ½¿¡ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´Â °ÍÀÌ ÇöÀçÀÇ thread·Î ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®ÀÇ ¼ö°¡ ÀÌ ¿ä±¸¸¦ ä¿î´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇÑ´Ù ÆÄ ¹ÌÆ®°¡ ÃëµæµÇ¸é, °ª true°¡ ¸®Åϵ˴ϴ٠.
ÇöÀçÀÇ thread·Î
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇßÀ» °æ¿ì,
InterruptedException
ÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® »óŰ¡ Ŭ¸®¾î µË´Ï´Ù. ÀÌ thread¿¡ ÇÒ´çÇÒ ¼ö ÀÖ¾î¾ßÇÒ ÆÄ ¹ÌÆ®´Â release()
È£Ãâ·Î ÀÌ¿ë °¡´ÉÇÏ°Ô µÇ¾ú´ÂÁö¿Í °°ÀÌ, ÆÄ ¹ÌÆ®ÀÇ ÃëµæÀ» ½ÃµµÇÏ´Â ´Ù¸¥ thread¿¡ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇϸé, °ª false°¡ ¸®Åϵ˴ϴÙ
. ½Ã°£ÀÌ Á¦·Î ¾Æ·¡ÀÇ °æ¿ì, ¸Þ¼µå´Â ´ë±âÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ thread¿¡ ÇÒ´çÇÒ ¼ö ÀÖ¾î¾ßÇÒ ÆÄ ¹ÌÆ®´Â ¸ðµÎ, release()
È£Ãâ¿¡ ÀÇÇØ ÀÌ¿ë °¡´ÉÇÏ°Ô µÇ¾ú´ÂÁö¿Í °°ÀÌ, ÆÄ ¹ÌÆ®ÀÇ ÃëµæÀ» ½ÃµµÇÏ´Â ´Ù¸¥ thread¿¡ ´ë½ÅÇØ¿¡ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù.
permits
- ¾ò´Â ÆÄ ¹ÌÆ®ÀÇ ¼ötimeout
- ÆÄ ¹ÌÆ®ÀÇ ÃÖÀå ´ë±â ½Ã°£unit
- timeout ÀμöÀÇ ½Ã°£ ´ÜÀ§
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì
IllegalArgumentException
- ÆÄ ¹ÌÆ®°¡ Á¦·Î ¹Ì¸¸ÀÇ °æ¿ìThread.interrupt()
public void release(int permits)
ÁöÁ¤¼öÀÇ ÆÄ ¹ÌÆ®¸¦ ÇØ¹æÇØ, ±× ¼ö¸¸Å ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®¸¦ ´Ã¸³´Ï´Ù. ÆÄ ¹ÌÆ®ÀÇ ÃëµæÀ» ½ÃµµÇÏ´Â ÀÓÀÇÀÇ thread°¡ ÀÖ´Â °æ¿ì, ±× Áß 1°³ÀÇ thread°¡ ¼±ÅõǾî ÇØ¹æµÈÁö ¾ó¸¶ ¾ÈµÈ ÆÄ ¹ÌÆ®°¡ ÁÖ¾îÁý´Ï´Ù. threadÀÇ ¿ä±¸¸¦ ä¿ì´Â ¼öÀÇ ÆÄ ¹ÌÆ®°¡ ÀÖ´Â °æ¿ì, ±× thread´Â threadÀÇ ½ºÄÉÁÙ»óÀÇ ¸ñÀûÀ» À¯È¿ (ÀçÀ¯È¿)·Î ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì, thread´Â ÃæºÐÇÑ ¼öÀÇ ÆÄ ¹ÌÆ®°¡ ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö ´ë±âÇÕ´Ï´Ù. ÀÌ threadÀÇ ¿ä±¸°¡ ä¿öÁø ´ÙÀ½¿¡µµ ¾ÆÁ÷ ÀÌ¿ë °¡´ÉÇÑ ÆÄ ¹ÌÆ®°¡ ³²¾Æ ÀÖ´Â °æ¿ì, À̹øÀº ÆÄ ¹ÌÆ®ÀÇ ÃëµæÀ» ½ÃµµÇÏ´Â ´Ù¸¥ thread¿¡ ÀÌ·¯ÇÑ ÆÄ ¹ÌÆ®¸¦ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÆÄ ¹ÌÆ®¸¦ ÇØ¹æÇÏ´Â thread°¡acquire
¸¦
È£ÃâÇØ ÆÄ ¹ÌÆ®¸¦ ÃëµæÀÌ ³¡³ »óÅÂÀÏ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. semaphoreÀÇ ÀûÁ¤ÇÑ »ç¿ë¹ýÀº ¾îÇø®ÄÉÀ̼ÇÀÇ ÇÁ·Î±×·¡¹Ö ±Ô¾à¿¡ ÀÇÇØ È®¸³µË´Ï´Ù.
permits
- ÇØ¹æÇÏ´Â ÆÄ ¹ÌÆ®ÀÇ ¼ö
IllegalArgumentException
- ÆÄ ¹ÌÆ®°¡ Á¦·Î ¹Ì¸¸ÀÇ °æ¿ìpublic int availablePermits()
º¸Åë, ÀÌ ¸Þ¼µå´Â µð¹ö±× ¹× Å×½ºÆ® ¸ñÀûÀ¸·Î »ç¿ëÇÕ´Ï´Ù.
public int drainPermits()
protected void reducePermits(int reduction)
reduction
- »èÁ¦ÇÏ´Â ÆÄ ¹ÌÆ®ÀÇ ¼ö
IllegalArgumentException
- ÁÙÀÌ´Â ¼ö°¡ ºÎÀÇ °æ¿ìpublic boolean isFair()
public final boolean hasQueuedThreads()
public final int getQueueLength()
protected Collection <Thread > getQueuedThreads()
public String toString()
Object
³»ÀÇ toString
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
ÀÌÀü Ŭ·¡½º ´ÙÀ½ Ŭ·¡½º | ÇÁ·¹ÀÓÀ¸·Î ÇÁ·¹ÀÓ ¾øÀÌ | |||||||||
°³¿ä: NESTED | Çʵå | constructor | ¸Þ¼µå | »ó¼¼: Çʵå | »ý¼ºÀÚ | ¸Þ¼µå |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy µµ ÂüÁ¶ÇϽʽÿÀ.