5-2.¸ÖƼ ½º·¹µå

Thread ÆÄ»ý Ŭ·¡½º

ÀÚ¹Ù´Â ¾ð¾î Â÷¿ø¿¡¼­ ¸ÖƼ ½º·¹µå¸¦ Áö¿øÇÑ´Ù. C/C++Àº ¸ÖƼ ½º·¹µå¿¡ ¾ÈÁ¤ÀûÀÎ ±¸Á¶¸¸ Á¦°øÇÒ »Ó ¸ÖƼ ½º·¹µå ÀÚü´Â Á¦°øÇÏÁö ¾Ê´Â´Ù. ½º·¹µå´Â ¿î¿µÃ¼Á¦ ¼öÁØ¿¡¼­ Á¦°øµÇ´Â °ÍÀÌ ¿øÄ¢ÀûÀÌÁö¸¸ ÀÚ¹ÙÀÇ °æ¿ì´Â °¡»ó ¸Ó½ÅÀÌ ¹Ì´Ï ¿î¿µÃ¼Á¦À̹ǷΠ¾ð¾î°¡ Á÷Á¢ÀûÀ¸·Î ½º·¹µå¸¦ Áö¿øÇÒ ¼ö ÀÖ´Ù.

½º·¹µå¸¦ Áö¿øÇÑ´Ù´Â °ÍÀº Çѹø¿¡ ¿©·¯ °¡Áö ÀÏÀ» µ¿½Ã¿¡ ¼öÇàÇÒ ¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù. ÃÖÃÊ ½ÇÇàÀ» ½ÃÀÛÇÒ ¶§´Â main ½º·¹µå Çϳª¹Û¿¡ ¾øÁö¸¸ Ãß°¡·Î ´õ ¸¸µé ¼ö ÀÖ´Ù. Ãß°¡ »ý¼ºµÈ ÀÛ¾÷ ½º·¹µå´Â ±âº»ÀûÀ¸·Î ¸ÞÀΰú °°Àº ·¹º§ÀÌ´Ù. ½º·¹µå³¢¸®´Â ÆòµîÇؼ­ ¸ðµç ½º·¹µå°¡ Á¾·áµÇ¾î¾ß ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù. Win32 ȯ°æÀÇ ½º·¹µå¿Í´Â Á» ´Ù¸¥µ¥ Win32¿¡¼­´Â ¸ÞÀÎÀÌ Á¾·áµÇ¸é ÀÛ¾÷ ½º·¹µå´Â °­Á¦ Á¾·áµÈ´Ù.

¸ÞÀÎÀÇ Á¾·áµÇ¸é °­Á¦·Î Á¾·áµÇ´Â ½º·¹µåµµ ¸¸µé ¼ö Àִµ¥ ÀÌ·± ½º·¹µå¸¦ µ¥¸ó ½º·¹µå¶ó°í ÇÑ´Ù. µ¥¸ó ½º·¹µå·Î ¸¸µé·Á¸é ½º·¹µå¸¦ ½ÃÀÛÇϱâ Àü¿¡ setDaemon(true)¸¦ È£ÃâÇÏ¸é µÈ´Ù. ´Ü¼øÇÑ Àå½ÄÀ» À§ÇÑ ¾Ö´Ï¸ÞÀÌ¼Ç Ã³¸®³ª Á¤º¸ÀÇ ÀúÀå°ú ÀüÇô »ó°ü¾ø´Â Á¤·Ä ·çƾ µîÀÇ ÀÛ¾÷Àº µ¥¸ó ½º·¹µå·Î »ý¼ºÇÑ´Ù.

ÀÚ¹Ù¿¡¼­´Â ½º·¹µåµµ ÇϳªÀÇ Å¬·¡½º·Î Ç¥ÇöµÇ¹Ç·Î ½º·¹µåº°·Î º°µµÀÇ Å¬·¡½º¸¦ Á¤ÀÇÇØ¾ß ÇÑ´Ù. Thread Ŭ·¡½º·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ¾Æ run ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÑ´Ù. ¿ÜºÎ¿¡¼­ È£ÃâÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷΠ¹Ýµå½Ã publicÀ̾î¾ß ÇÏ¸ç ¸®ÅÏ°ªÀº °¡ÁöÁö ¾Ê´Â´Ù. run ¸Þ¼­µå´Â ½º·¹µåÀÇ ÁøÀÔÁ¡À̸ç ÀÌ ¸Þ¼­µå¿¡¼­ ½º·¹µåÀÇ ÀÛ¾÷À» ó¸®ÇÑ´Ù. run ¸Þ¼­µå°¡ ¸®ÅÏÇÏ¸é ½º·¹µåµµ Á¾·áÇÑ´Ù.

¸ÞÀο¡¼­´Â ½º·¹µå¸¦ »ý¼º ¹× ½ÇÇàÇÑ´Ù. ½º·¹µå °´Ã¼¸¦ ¼±¾ðÇÑ ÈÄ new ¿¬»êÀÚ·Î »ý¼ºÇϸç ÇÊ¿äÇÏ´Ù¸é »ý¼ºÀÚ·Î ½º·¹µå µ¿ÀÛ¿¡ ÇÊ¿äÇÑ Àμö¸¦ Àü´ÞÇÒ ¼ö ÀÖ´Ù. ½º·¹µå °´Ã¼ »ý¼º ÈÄ¿¡ ¿ì¼± ¼øÀ§³ª À̸§ µîÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇÒ ¼ö Àִµ¥ µðÆúÆ®µµ ¹«³­ÇÏ´Ù. ±×¸®°í start ¸Þ¼­µå¸¦ È£ÃâÇϴµ¥ start¿¡ ÀÇÇØ ½º·¹µå¸¦ À§ÇÑ ½ºÅà µîÀÇ ½ÇÇà ȯ°æÀÌ ¸¸µé¾îÁö°í run ¸Þ¼­µå°¡ È£ÃâµÈ´Ù.

ÀÌÈÄ ¸ÞÀÎ ½º·¹µå¿Í ÀÛ¾÷ ½º·¹µå´Â º°µµÀÇ ½ÇÇà È帧À» °¡Áö¸ç µ¿½Ã¿¡ ½ÇÇàµÈ´Ù. JVMÀº CPUÀÇ ½Ã°£À» Àß°Ô ÂÉ°³¾î ½º·¹µå¸¦ ¹ø°¥¾Æ °¡¸ç ½ÇÇàÇÏ¿© µ¿½Ã¿¡ ½ÇÇàµÇ´Â °Íó·³ º¸ÀÌ°Ô ÇÑ´Ù. ÀÌ·± ¹æ½ÄÀ» ¶ó¿îµå ·ÎºóÀ̶ó°í ÇÑ´Ù. °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ. ÅؽºÆ® ȯ°æ¿¡¼­´Â ¸ÖƼ ½º·¹µå¸¦ ½Ç¿ëÀûÀ¸·Î »ç¿ëÇÒ¸¸ÇÑ ¿¹°¡ ¾ø¾î ¹®ÀÚ¿­¸¸ Ãâ·ÂÇØ º¸¾Ò´Ù.

 

public class JavaExam {

     public static void main(String[] args) {

          MyThread worker = new MyThread();

          worker.start();

         

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(50); } catch (InterruptedException e) { ; }

              System.out.print("Java ");

          }

     }

}

 

class MyThread extends Thread {

     public void run() {

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(30); } catch (InterruptedException e) { ; }

              System.out.print("ÀÚ¹Ù ");

          }

     }

}

 

MyThreadÀÇ run ¸Þ¼­µå´Â 0.03ÃÊ¿¡ Çѹø¾¿ "ÀÚ¹Ù"¶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù. ¸ÞÀÎ ½º·¹µå´Â 0.05ÃÊ¿¡ Çѹø¾¿ "Java"¶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù. µÎ ½º·¹µå°¡ ±³´ë·Î ½ÇÇàµÇ´Â °ÍÀ» È®ÀÎÇØ º¸±â À§ÇØ °¢ µ¿ÀÛ Çѹø´ç Á¶±Ý¾¿ ½¬µµ·Ï Çߴµ¥ À̶§´Â ´ÙÀ½ Á¤Àû ¸Þ¼­µå¸¦ È£ÃâÇÑ´Ù.

 

static void sleep(long millis)

static void yield()

 

1/1000ÃÊ ´ÜÀ§·Î ½Ã°£À» ÁöÁ¤Çϸé ÀÌ ½Ã°£¸¸Å­ ½º·¹µå´Â ½ÇÇàÀ» ÁßÁöÇÏ°í Àá½Ã ½®´Ù. sleep ½ÇÇàÁß¿¡ ¿¹¿Ü°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã try ºí·ÏÀ¸·Î ¹­¾î¾ß ÇÑ´Ù. yield´Â ÇöÀç ÇÒ´çµÈ ½Ã°£¸¸ Æ÷±âÇÏ°í ´Ù¸¥ ½º·¹µå·Î ½ÇÇà ½Ã°£À» ¾çº¸ÇÑ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù ÀÚ¹Ù Java ÀÚ¹Ù Java Java Java Java Java Java Java Java Java Java

 

µÎ ¹®ÀÚ¿­ÀÌ ºÒ±ÔÄ¢ÇÏ°Ô ¼¯¿©¼­ Ãâ·ÂµÇ´Â °ÍÀ» º¸¸é ±³´ë·Î ½ÇÇàµÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. °¢ ½º·¹µå´Â CPU ½Ã°£À» °øÆòÇÏ°Ô ºÐ¹è ¹ÞÁö¸¸ ÀÛ¾÷ ½º·¹µå´Â 0.03Ãʸ¦ ½¬°í ¸ÞÀÎ ½º·¹µå´Â 0.05Ãʸ¦ ½¬¹Ç·Î ÀÛ¾÷ ½º·¹µå°¡ ´õ ¸¹Àº ½Ã°£À» »ç¿ëÇÑ´Ù. ´ÙÀ½ µÎ ¸Þ¼­µå´Â ½º·¹µåÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù.

 

void setPriority(int newPriority)

void setName(String name)

 

¿ì¼± ¼øÀ§´Â MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY Áß Çϳª¸¦ ÁöÁ¤ÇÑ´Ù. º° ÁöÁ¤ÀÌ ¾øÀ¸¸é ÀÌ ½º·¹µå¸¦ »ý¼ºÇÑ ½º·¹µåÀÇ ¿ì¼± ¼øÀ§´ë·Î »ý¼ºµÈ´Ù. ¿ì¼± ¼øÀ§¸¦ ÀÓÀÇ·Î º¯°æÇϸé JVMÀÇ Á¤±³ÇÑ ½ºÄÉÁÙ¸µ ¾Ë°í¸®Áò¿¡ ¹æÇØ°¡ µÇ¹Ç·Î ¿Ø¸¸ÇÏ¸é °Çµå¸®Áö ¾Ê´Â °ÍÀÌ ÁÁ´Ù. ½º·¹µåÀÇ À̸§Àº µð¹ö±ëÀ̳ª Á¤º¸ Ãâ·Â¿ëÀ¸·Î »ç¿ëµÇ¸ç ½ÇÇà°ú´Â »ó°üÀÌ ¾ø´Ù.

Runnable ÀÎÅÍÆäÀ̽º

½º·¹µå¸¦ »ý¼ºÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀº Runnable ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °ÍÀÌ´Ù. Runnable ÀÎÅÍÆäÀ̽ºÀÇ run ¸Þ¼­µå ¾È¿¡¼­ Äڵ带 ½ÇÇàÇÑ´Ù. ¾Õ ¿¹Á¦¿Í ¶È°°Àº ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.

 

public class JavaExam {

     public static void main(String[] args) {

          MyRunnable MyRun = new MyRunnable();

          Thread worker = new Thread(MyRun);

          worker.start();

         

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(50); } catch (InterruptedException e) { ; }

              System.out.print("Java ");

          }

     }

}

 

class MyRunnable implements Runnable {

     public void run() {

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(30); } catch (InterruptedException e) { ; }

              System.out.print("ÀÚ¹Ù ");

          }

     }

}

 

MyRunnable Ŭ·¡½º´Â Runnable ÀÎÅÍÆäÀ̽ºÀÇ run ¸Þ¼­µå¸¦ ±¸ÇöÇÑ´Ù. main¿¡¼­ MyRunnable °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ ThreadÀÇ »ý¼ºÀÚ·Î ³Ñ±â¸é ÀÌ °´Ã¼ÀÇ run ¸Þ¼­µå°¡ ½º·¹µåÀÇ ÁøÀÔÁ¡À¸·Î »ç¿ëµÈ´Ù. ÀÌÈÄ ½º·¹µå °´Ã¼ÀÇ start ¸Þ¼­µå¸¦ È£ÃâÇÏ¸é »õ·Î¿î ½º·¹µå°¡ »ý¼ºµÇ¸ç ·¯³Êºí °´Ã¼ÀÇ run ¸Þ¼­µå°¡ ½ÇÇàÀ» ½ÃÀÛÇÑ´Ù.

Thread Ŭ·¡½º·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ´Â ¹æ¹ý¿¡ ºñÇØ ¾à°£ ¹ø°Å·Ó°í Á÷°üÀûÀÌÁö ¸øÇÏ´Ù. ÀÌ ¹æ¹ýÀÌ ÇÊ¿äÇÑ ÀÌÀ¯´Â ÀÚ¹Ù°¡ ´ÙÁß »ó¼ÓÀ» Áö¿øÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ º¸ÀÚ.

 

public class JavaExam {

     public static void main(String[] args) {

          MyRunnable MyRun = new MyRunnable();

          Thread worker = new Thread(MyRun);

          worker.start();

         

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(50); } catch (InterruptedException e) { ; }

              System.out.print("Java ");

          }

     }

}

 

class MyClass {

     public void PrintJava() {

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(30); } catch (InterruptedException e) { ; }

              System.out.print("ÀÚ¹Ù ");

          }

     }

}

 

class MyRunnable extends MyClass implements Runnable {

     public void run() {

          PrintJava();

     }

}

 

ÀÌ ¿¹Á¦ÀÇ MyClass´Â PrintJava¶ó´Â ¸Þ¼­µå¸¦ °¡Áø´Ù. ÀÌ Å¬·¡½º¸¦ »ó¼Ó¹Þ¾Æ Á¶±Ý ´Ù¸£°Ô µ¿ÀÛÇϵµ·Ï ¸¸µç ÈÄ º°µµÀÇ ½º·¹µå¿¡¼­ ½ÇÇàÇÏ°í ½Í´Ù°í ÇÏÀÚ. MyClass¸¦ ¼öÁ¤ÇÏ·Á¸é ÀÌ Å¬·¡½º¸¦ »ó¼Ó ¹Þ¾Æ¾ß ÇÏ°í ½º·¹µå¿¡¼­ ½ÇÇàÇÏ°í ½ÍÀ¸¸é Thread·ÎºÎÅ͵µ »ó¼ÓÀ» ¹Þ¾Æ¾ß ÇÑ´Ù. ¿øÇϴ´ë·Î ÇÏÀÚ¸é ´ÙÀ½ ±¸¹®ÀÌ ÇÊ¿äÇÏ´Ù.

 

class MyThread extends MyClass extends Thread {

 

ÀÚ¹Ù´Â ÀÌ·± ´ÙÁß »ó¼ÓÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ run ¸Þ¼­µå¸¦ °¡Áö´Â ÀÎÅÍÆäÀ̽º¸¦ ´ë½Å Á¦°øÇÏ´Â °ÍÀÌ´Ù. ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ run ¸Þ¼­µå¸¦ »ó¼Ó¹Þ¾Æ ±¸ÇöÇÑ ÈÄ ½º·¹µåÀÇ »ý¼ºÀÚ·Î ³Ñ±â¸é ½º·¹µå°¡ run ¸Þ¼­µå¸¦ ÁøÀÔÁ¡À¸·Î »ç¿ëÇÑ´Ù.

Âü°í·Î ¾ÕÀÇ Runnable »ç¿ë ¿¹Á¦´Â À͸í ÀÌ³Ê Å¬·¡½º¸¦ »ç¿ëÇϸé Á» ´õ °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. µü ÇϳªÀÇ °´Ã¼¸¸ »ý¼ºÇϹǷΠ±»ÀÌ MyRunnableÀ̶ó´Â Ŭ·¡½º¸¦ Á¤ÀÇÇÒ ÇÊ¿ä¾øÀÌ À͸íÀÇ Å¬·¡½º·ÎºÎÅÍ »ý¼ºµÈ Á¤Àû ¸â¹ö¸¦ ¼±¾ðÇÏ¸é µÈ´Ù.

 

public class JavaExam {

     public static void main(String[] args) {

          Thread worker = new Thread(mRunnable);

          worker.start();

         

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(50); } catch (InterruptedException e) { ; }

              System.out.print("Java ");

          }

     }

    

     static Runnable mRunnable = new Runnable() {

          public void run() {

              for (int num = 0;num < 20;num++) {

                   try { Thread.sleep(30); } catch (InterruptedException e) { ; }

                   System.out.print("ÀÚ¹Ù ");

              }

          }

     };

}

 

µü ÇϳªÀÇ °´Ã¼¸¸ ÇÊ¿äÇϹǷΠ±»ÀÌ °´Ã¼¸¦ »ý¼ºÇϰųª staticÀ¸·Î ¼±¾ðÇÒ ÇÊ¿ä¾øÀÌ °´Ã¼ »ý¼º¹®À» ThreadÀÇ »ý¼ºÀÚ ¾È¿¡ Áý¾î ³Ö¾î ¹ö¸®¸é ´õ °£´ÜÇÏ°Ô ÁÙÀÏ ¼öµµ ÀÖ´Ù.

 

public class JavaExam {

     public static void main(String[] args) {

          Thread worker = new Thread(new Runnable() {

               public void run() {

                   for (int num = 0;num < 20;num++) {

                        try { Thread.sleep(30); } catch (InterruptedException e) { ; }

                        System.out.print("ÀÚ¹Ù ");

                   }

              }

          });

          worker.start();

         

          for (int num = 0;num < 20;num++) {

              try { Thread.sleep(50); } catch (InterruptedException e) { ; }

              System.out.print("Java ");

          }

     }

}

 

±æÀÌ´Â ÈξÀ ´õ ª¾ÆÁ³Áö¸¸ ÀÌ·± ±¸¹®À» óÀ½ º¸´Â Ãʺ¸ÀÚ¿¡°Ô´Â »ó´çÈ÷ ¾î·Á¿ö º¸ÀδÙ. AWT¿¡¼­´Â ÀÌ·± ¹æ½ÄÀ» ÈçÇÏ°Ô »ç¿ëÇÑ´Ù.

½º·¹µå Åë½Å

½º·¹µå´Â º¸Åë »óÈ£ ¿ÏÀüÈ÷ µ¶¸³ÀûÀÎ ÀÛ¾÷À» ´ã´çÇÑ´Ù. ¿¹¸¦ µé¾î È­¸é Àå½ÄÀ» À§ÇÑ ¾Ö´Ï¸ÞÀÌ¼Ç ½º·¹µå¿Í Àμ⠽º·¹µå´Â ¾Æ¹« »ó°üÀÌ ¾ø´Ù. ÀÌ·² ¶§´Â ½º·¹µå³¢¸® ¼­·ÎÀÇ ½ÇÇà ¹æ½ÄÀ̳ª ÀÛ¾÷ °á°ú¿¡ ½Å°æ¾µ ÇÊ¿ä°¡ ¾ø°í ½ÉÁö¾î ¼­·ÎÀÇ Á¸À縦 ¸ô¶óµµ »ó°ü¾ø´Ù.

±×·¯³ª ¶§·Î´Â ¿¬°üµÈ ÀÛ¾÷À» ºÐ´ãÇÏ¿© ½ÇÇàÇϱ⵵ Çϴµ¥ À̶§´Â °øÀ¯ÇÏ´Â µ¥ÀÌÅÍ°¡ Àֱ⠸¶·ÃÀ̸ç ÀÌ µ¥ÀÌÅ͸¦ ÀûÀýÈ÷ °ü¸®Çϱâ À§ÇØ ¼­·Î Åë½ÅÀ» ÇØ¾ß ÇÑ´Ù. ÀüÇüÀûÀÎ ¿¹´Â ´Ù¿î·Îµå ½º·¹µå¿Í ´Ù¿î·ÎµåµÈ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ´Â ½º·¹µåÀÌ´Ù. ¿¹¸¦ µé¾î µ¿¿µ»óÀ» ´Ù¿î·Îµå ÇÏ´Â ½º·¹µå°¡ ÀÖ°í ´Ù¿î·Îµå ¹ÞÀº µ¿¿µ»óÀÇ ¹Ì¸® º¸±â¸¦ Ãâ·ÂÇÏ´Â ½º·¹µå°¡ ÀÖ´Ù°í ÇÏÀÚ.

´Ù¿î·Îµå ¹ÞÀº µ¿¿µ»óÀ» ÀúÀåÇÏ´Â Àå¼Ò¿Í ¹Ì¸® º¸±â¸¦ ÇÒ µ¿¿µ»óÀÌ ÀÖ´Â Àå¼Ò°¡ °°À¸¹Ç·Î ¾îµð±îÁö ¹Þ¾Ò´ÂÁö, ¹ÞÀº µ¥ÀÌÅÍ°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë·Á ÁÖ¾î¾ß ÇÑ´Ù. ½º·¹µå³¢¸® °øÀ¯ÇÒ µ¥ÀÌÅ͸¦ °´Ã¼·Î ¸¸µç ÈÄ ¾çÂÊ ½º·¹µå¿¡°Ô Àü´ÞÇÑ´Ù. ±âº»ÇüÀº »çº»ÀÌ Àü´ÞµÇ¹Ç·Î °øÀ¯ µ¥ÀÌÅÍ·Î »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç À§Ä¡°¡ Àü´ÞµÇ´Â ÂüÁ¶Çü¸¸ °øÀ¯ µ¥ÀÌÅÍ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½ ¿¹Á¦ÀÇ DownLoad ½º·¹µå´Â µ¿¿µ»óÀ» ´Ù¿î·Îµå Çϸç Play ½º·¹µå´Â ´Ù¿î·ÎµåÁßÀÎ µ¿¿µ»óÀ» Àç»ýÇÑ´Ù. ÄÜ¼Ö È¯°æ¿¡¼­ µ¿¿µ»óÀ» Àç»ýÇÒ ¼ö´Â ¾øÀ¸¹Ç·Î Á¤¼öÇü µ¥ÀÌÅ͸¦ µ¿¿µ»óÀ¸·Î °¡Á¤ÇÏ¿© ¼³¸íÇϱâ·Î ÇÑ´Ù.

 

public class JavaExam {

     public static void main(String[] args) {

          Memory mem = new Memory(16);

          DownLoad down = new DownLoad(mem);

          Play play = new Play(mem);

         

          down.start();

          play.start();

     }

}

 

class Memory {

     int[] buffer;

     int size;

     int progress;

     Memory(int asize) {

          size = asize;

          buffer = new int[asize];

          progress = 0;

     }

}

 

class DownLoad extends Thread {

     Memory mem;

     DownLoad(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (int off = 0;off < mem.size;off++) {

              mem.buffer[off] = off;

              mem.progress = off + 1;

              try { Thread.sleep(200); } catch (InterruptedException e) { ; }

          }

     }

}

 

class Play extends Thread {

     Memory mem;

     Play(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (;;) {

              for (int off = 0;off < mem.progress;off++) {

                   System.out.print(mem.buffer[off] + " ");

              }

              System.out.println();

              if (mem.progress == mem.size) break;

              try { Thread.sleep(500); } catch (InterruptedException e) { ; }

          }

     }

}

 

ÀÌ ¿¹Á¦ÀÇ Memory Ŭ·¡½º°¡ °øÀ¯ µ¥ÀÌÅÍÀÌ´Ù. ´Ù¿î·Îµå ¹ÞÀ» µ¿¿µ»óÀÇ ±æÀÌ¿¡ ÇØ´çÇÏ´Â buffer ¹è¿­À» °¡Áö¸ç ¹öÆÛ Å©±â¿Í ´Ù¿î·Îµå ÁøÇà »óȲÀ» size, progress Çʵ忡 ±â¾ïÇÑ´Ù. »ý¼ºÀÚ¿¡¼­´Â Àü´Þ¹ÞÀº ±æÀÌ´ë·Î ¹öÆÛ¸¦ ¹Ì¸® ÇÒ´çÇØ ³õÀ¸¸ç progress´Â 0À¸·Î ÃʱâÈ­ÇÑ´Ù.

¸ÞÀÎ ½º·¹µå¿¡¼­´Â ±æÀÌ 16ÀÇ °øÀ¯ ¹öÆÛ °´Ã¼¸¦ »ý¼ºÇ쵂 ÀÌ °´Ã¼¸¦ DownLoad¿Í Play ½º·¹µåÀÇ »ý¼ºÀÚ·Î Àü´ÞÇÑ´Ù. °¢ ½º·¹µå´Â memÀ̶ó´Â À̸§À¸·Î °øÀ¯ °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ÀúÀåÇÏ¿© ÀÌÈÄÀÇ Åë½ÅÀ» ÁغñÇÑ´Ù. ÂüÁ¶ÇüÀ̹ǷΠ»çº»ÀÌ »ý¼ºµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó °°Àº °´Ã¼¸¦ °¡¸®Å°°í ÀÖÀ¸¸ç µû¶ó¼­ ÇÑÂÊ¿¡¼­ º¯°æÇÏ¸é ´Ù¸¥ÂÊ¿¡¼­ Áï½Ã º¯°æµÈ ³»¿ëÀ» ÀÐÀ» ¼ö ÀÖ´Ù.

DownLoad ½º·¹µåÀÇ run ¸Þ¼­µå¿¡¼­´Â ¹öÆÛÀÇ ±æÀ̸¸Å­ ·çÇÁ¸¦ µ¹¸ç ´Ù¿î·Îµå¸¦ ¹Þ´Â´Ù. ½ÇÁ¦ ³×Æ®¿öÅ©¿¡ Á¢¼ÓÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ ¹öÆÛÀÇ ¹è¿­ ÷ÀÚ¸¦ Áý¾î ³Ö¾î ´Ù¿î·Îµå ¹ÞÀº Èä³»¸¸ ³½´Ù. Çѹø¿¡ 1¹ÙÀÌÆ®¾¿ ¹ÞÀ¸¸ç progress¿¡ ¾îµð±îÁö ¹Þ¾Ò´ÂÁö ±â·ÏÇØ ³õ´Â´Ù. ·çÇÁ ³»ºÎ¿¡¼­ 0.2Ãʾ¿ ½¬¾î ³×Æ®¿öÅ© ¼Óµµ°¡ ´À¸° °Íó·³ Çß´Ù.

Paly ¸Þ¼­µå´Â progress±îÁö, Áï ´Ù¿î·Îµå ½º·¹µå°¡ ¹ÞÀº ¾ç¸¸Å­ ¹öÆÛ¸¦ ´ýÇÁÇÏ¿© ¾îµð±îÁö¸¦ ¹Þ¾Ò´ÂÁö º¸¿©ÁØ´Ù. ¹«ÇÑ ·çÇÁ¸¦ µ¹¸ç ´Ù ¹ÞÀ» ¶§±îÁö 0.5ÃÊ¿¡ Çѹø¾¿ ¹Ì¸® º¸±â¸¦ Ãâ·ÂÇϵµ·Ï Çß´Ù. ¹Ì¸® º¸±â¸¦ ³Ê¹« ÀÚÁÖ º¸¿©ÁÙ ÇÊ¿ä´Â ¾ø´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°Àºµ¥ ½º·¹µåÀÇ ½ÇÇà ½Ã°£ÀÌ ½Ã½ºÅÛ »óȲ¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î ¿ÏÀüÈ÷ ¶È°°Àº °á°ú°¡ ³ª¿ÀÁö´Â ¾Ê´Â´Ù.

 

0

0 1 2

0 1 2 3 4 5

0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 5 6 7 8 9 10 11 12

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

 

´Ù¿î·Îµå ½º·¹µå´Â buffer¿¡ ¿­½ÉÈ÷ ´Ù¿î·Îµå¸¸ ¹Þ°í Play ½º·¹µå´Â ´Ù¿î·Îµå ½º·¹µå°¡ ¹Þ¾Æ ³õÀº ¸¸Å­¸¸ º¸¿© ÁØ´Ù. ´Ù¿î·Îµå ¹ÞÀº µ¿¿µ»ó Á¤º¸¿Í ¾îµð±îÁö ´Ù¿î·Îµå¸¦ ¹Þ¾Ò´ÂÁö´Â mem °øÀ¯ °´Ã¼¸¦ ÂüÁ¶ÇÑ´Ù. ÇÑÂÊ¿¡¼­´Â ¿­½ÉÈ÷ ¾²°í ÇÑÂÊ¿¡¼­´Â ¿­½ÉÈ÷ Àд °ÍÀÌ´Ù.

½º·¹µå µ¿±âÈ­

½º·¹µå´Â °¢ÀÚ µ¶¸³ÀûÀ¸·Î ½ÇÇàµÇ¹Ç·Î ½º·¹µåÀÇ ½ÇÇà ¼ø¼­³ª ½ÇÇà ½Ã°£Àº ÀüÇô ¿¹ÃøÇÒ ¼ö ¾øÀ¸¸ç ÅëÁ¦ÇÒ ¼öµµ ¾ø´Ù. ±×·¯´Ù º¸¸é µ¥ÀÌÅÍ°¡ ¾ÆÁ÷ ÁغñµÇÁö ¾ÊÀº »óȲÀε¥µµ ½º·¹µå°¡ ½ÇÇàµÇ¾î ¾û¶×ÇÑ °á°ú°¡ ³ª¿À±âµµ ÇÑ´Ù. ¾Õ ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

class DownLoad extends Thread {

     Memory mem;

     DownLoad(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (int off = 0;off < mem.size;off += 2) {

              for (int chunk = 0;chunk < 2;chunk++) {

                   mem.buffer[off+chunk] = off+chunk;

                   mem.progress = off+chunk+1;

                   try { Thread.sleep(200); } catch (InterruptedException e) { ; }

              }

          }

     }

}

 

´Ù¿î·Îµå ½º·¹µåÀÇ Äڵ尡 Á¶±Ý ¹Ù²î¾ú´Âµ¥ µ¿¿µ»óÀ» 1¹ÙÀÌÆ®¾¿ ¹ÞÁö ¾Ê°í Çѹø¿¡ 2¹ÙÀÌÆ®¾¿ ¹Þ´Â´Ù. µ¿¿µ»ó°°Àº ¾ÐÃà ÆÄÀÏÀº ³»ºÎ¿¡ ºí·ÏÀÌ ³ª´©¾îÁ® ÀÖÀ¸¸ç ÇÑ ºí·ÏÀº ¿©·¯ °³ÀÇ Ã»Å©·Î ±¸¼ºµÈ´Ù. À§ ÄÚµå´Â 2¹ÙÀÌÆ®¸¦ ÇÑ ºí·ÏÀ¸·Î °¡Á¤ÇÏ°í ºí·Ï ´ÜÀ§·Î ´Ù¿î·Îµå ¹Þ´Â °ÍÀ» Èä³»³½ °ÍÀÌ´Ù.

ÀÌ·¸°Ô µÇ¸é ¹Ì¸® º¸±â ½º·¹µåµµ ÇÑ ºí·ÏÀ» ´Ù ¹Þ¾ÒÀ» ¶§¸¸ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù. ¹ÝÂÊÂ¥¸® ºí·ÏÀº ¿ÏÀüÇÑ µ¥ÀÌÅÍ°¡ ¾Æ´Ï¹Ç·Î ¹Ì¸® º¸±â¸¦ ÇÒ ¼ö ¾ø´Ù. ¾ïÁö·Î ¸¸µç ¼³Á¤À̶ó Á÷°üÀûÀÌÁö´Â ¸øÇÏÁö¸¸ ¦¼ö ¹ÙÀÌÆ®·Î ¹Þ¾ÒÀ» ¶§¸¸ ¹Ì¸® º¸±â°¡ °¡´ÉÇÏ´Ù°í ÇÏÀÚ. ÀÌ »óÅ¿¡¼­ ½ÇÇàÇØ º¸¸é ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.

 

0 1 2

0 1 2 3 4 5

0 1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

 

¦¼ö°³°¡ ³ª¿Ã ¶§µµ ÀÖÁö¸¸ Ȧ¼ö°³°¡ ³ª¿À±âµµ ÇÑ´Ù. ¿Ö³ÄÇÏ¸é µÎ ½º·¹µå°¡ ¾ðÁ¦ ½ÇÇàµÉÁö ÀüÇô ¿¹ÃøÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. DownLoad°¡ ÇÑ ºí·ÏÀ» ¹Þ°í ÀÖ´Â Áß°£¿¡ Play ½º·¹µå°¡ Á¦¾î±ÇÀ» ¹ÞÀ¸¸é ¹Ì¿Ï¼ºµÈ ºí·ÏÀÌ º¸ÀδÙ. ÀÌ ¿¹Á¦ÀÇ °æ¿ì´Â ´Ü¼øÇÑ ¼ýÀÚ¶ó º° ÀÌ»ó¾øÁö¸¸ ÁøÂ¥ µ¿¿µ»óÀ̶ó¸é ¾ÆÁ÷ ´ú ¹ÞÀº µ¥ÀÌÅÍÀÇ ¾ÐÃàÀ» Ç®´Ù°¡ ´Ù¿îµÉ ¼öµµ ÀÖ´Ù.

¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ÇÑ ºí·ÏÀ» ´Ù ¹Þ±â Àü¿¡´Â Àç»ýÀ» ÇÏÁö ¸øÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. °øÀ¯ °´Ã¼¸¦ µÎ ½º·¹µå°¡ ¹«ÀÛÀ§·Î ÀÐ°í ½á¼­´Â ¾ÈµÇ¸ç ¹ø°¥¾Æ °¡¸ç »ç¿ëÇØ¾ß ÇÑ´Ù. ÇÑÂÊ¿¡¼­ ¾²°í ÀÖ´Â µ¿¾È¿¡´Â ´Ù¸¥ ÂÊ¿¡¼­ ÀÐÁö ¸øÇÏ°í ¹Ý´ë·Î Àаí ÀÖ´Â µ¿¾È¿¡´Â ¾²Áö ¸øÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. µÎ ½º·¹µå°¡ µ¿½Ã¿¡ ÁøÀÔÇÒ ¼ö ¾ø´Â ¿µ¿ªÀ» Å©¸®Æ¼Äà ¼½¼ÇÀ̶ó°í ÇÑ´Ù. Å©¸®Æ¼Äà ¼½¼ÇÀ» ¸¸µé ¶§´Â ´ÙÀ½ ±¸¹®À» »ç¿ëÇÑ´Ù.

 

synchronized (°øÀ¯°´Ã¼) {

          // ÀÌ ¿µ¿ªÀÌ Å©¸®Æ¼Äà ¼½¼Ç

}

 

°øÀ¯ °´Ã¼´Â º¸È£ÇÏ°íÀÚ ÇÏ´Â Á¤º¸ÀÌ¸ç ¾çÂÊ¿¡¼­ ¾×¼¼½º °¡´ÉÇØ¾ß ÇÑ´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì memÀÌ ¹Ù·Î °øÀ¯ °´Ã¼ÀÌ´Ù. µÎ ½º·¹µå¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

class DownLoad extends Thread {

     Memory mem;

     DownLoad(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (int off = 0;off < mem.size;off += 2) {

           synchronized(mem) {

                   for (int chunk = 0;chunk < 2;chunk++) {

                        mem.buffer[off+chunk] = off+chunk;

                        mem.progress = off+chunk+1;

                        try { Thread.sleep(200); } catch (InterruptedException e) { ; }

                   }

              }

          }

     }

}

 

class Play extends Thread {

     Memory mem;

     Play(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (;;) {

           synchronized(mem) {

                   for (int off = 0;off < mem.progress;off++) {

                        System.out.print(mem.buffer[off] + " ");

                   }

                   System.out.println();

              }

              if (mem.progress == mem.size) break;

              try { Thread.sleep(500); } catch (InterruptedException e) { ; }

          }

     }

}

 

mem °´Ã¼¸¦ ¾×¼¼½ºÇÏ´Â ºÎºÐÀ» Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î µÑ·¯½Õ´Ù. ÀÌ·¸°Ô µÇ¸é Çѹø¿¡ ÇÑ ½º·¹µå¸¸ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î µé¾î°¥ ¼ö ÀÖ´Ù. ¸¸¾à ´Ù¿î·Îµå ½º·¹µå°¡ ¾²±â¸¦ ÇÏ°í ÀÖ´Ù¸é Àç»ý ½º·¹µå´Â ¾²±â°¡ ³¡³¯ ¶§±îÁö ±â´Ù¸°´Ù. ÇÑ ºí·ÏÀÌ ¿Ï¼ºµÉ ¶§¸¸ Àç»ýÀ» ÇϹǷΠºÒ¿ÏÀüÇÑ µ¿¿µ»óÀ» º¸¿© ÁÖÁö ¾Ê´Â´Ù. ¸¶Âù°¡Áö·Î Àç»ýÀ» ÇÏ´Â µ¿¾È¿¡´Â ´Ù¿î·Îµå ½º·¹µåµµ Àá½Ã ÁßÁöÇÏ°í Àç»ýÀÌ ¿Ï·áµÉ ¶§±îÁö ±â´Ù¸°´Ù. ½ÇÇàÇØ º¸ÀÚ.

 

0 1 2 3 4 5

0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

 

½ÇÇàÇÒ ¶§¸¸ °á°ú´Â Á¶±Ý¾¿ ´Þ¶óÁö°ÚÁö¸¸ Ç×»ó ¦¼ö°³¸¸ Ãâ·ÂµÉ °ÍÀÌ´Ù.

µ¿±âÈ­ ¸Þ¼­µå

´Ù¿î·Îµå¸¦ ¹Þ´Â µ¿ÀÛ°ú Àç»ýÀ» ÇÏ´Â µ¿ÀÛÀº ¸ðµÎ Memory °´Ã¼¸¦ ´ë»óÀ¸·Î ÇÑ´Ù. ±×·¡¼­ µÎ µ¿ÀÛÀ» Memory Ŭ·¡½º¾ÈÀÇ ¸Þ¼­µå·Î ĸ½¶È­ÇÏ°í ½º·¹µå¿¡¼­´Â °øÀ¯ °´Ã¼ÀÇ ¸Þ¼­µå¸¸ È£ÃâÇÏ¸é µÈ´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

public class JavaExam {

     public static void main(String[] args) {

          Memory mem = new Memory(16);

          DownLoad down = new DownLoad(mem);

          Play play = new Play(mem);

         

          down.start();

          play.start();

     }

}

 

class Memory {

     int[] buffer;

     int size;

     int progress;

     Memory(int asize) {

          size = asize;

          buffer = new int[asize];

          progress = 0;

     }

 

     void DownChunk(int off) {

          for (int chunk = 0;chunk < 2;chunk++) {

              buffer[off+chunk] = off+chunk;

              progress = off+chunk+1;

              try { Thread.sleep(200); } catch (InterruptedException e) { ; }

          }

     }

    

     void PlayDowned() {

          for (int off = 0;off < progress;off++) {

              System.out.print(buffer[off] + " ");

          }

          System.out.println();

     }

}

 

class DownLoad extends Thread {

     Memory mem;

     DownLoad(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (int off = 0;off < mem.size;off += 2) {

              mem.DownChunk(off);

          }

     }

}

 

class Play extends Thread {

     Memory mem;

     Play(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (;;) {

              mem.PlayDowned();

              if (mem.progress == mem.size) break;

              try { Thread.sleep(500); } catch (InterruptedException e) { ; }

          }

     }

}

 

°°Àº ¿¹Á¦¸¦ ´Ù¸¥ Çü½ÄÀ¸·Î ÀÛ¼ºÇÑ °ÍÀÌ´Ù. Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î º¸È£ÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î µ¿±âÈ­ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. DownChunk°¡ ¹Ý¸¸ ¹Þ¾ÒÀ» ¶§ PlayDowned°¡ ½ÇÇàµÉ ¼ö ÀÖ´Ù. ÀÌ ¸Þ¼­µå¾ÈÀ» Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î °¨½Î¾ß ÇÑ´Ù.

 

void DownChunk(int off) {

     synchronized(this) {

          for (int chunk = 0;chunk < 2;chunk++) {

              buffer[off+chunk] = off+chunk;

              progress = off+chunk+1;

              try { Thread.sleep(200); } catch (InterruptedException e) { ; }

          }

     }

}

 

void PlayDowned() {

     synchronized(this) {

          for (int off = 0;off < progress;off++) {

              System.out.print(buffer[off] + " ");

          }

          System.out.println();

     }

}

 

À̶§ µ¿±âÈ­ °´Ã¼´Â ¹Ù·Î ÀÚ±â ÀÚ½ÅÀ̹ǷΠthis¶ó°í ÁöÁ¤ÇÏ¸é µÈ´Ù. Á¦´ë·Î µ¿±âÈ­µÈ´Ù. ¸Þ¼­µåÀÇ º»Ã¼ Àüü°¡ this¿¡ ´ëÇØ Å©¸®Æ¼Äà ¼½¼ÇÀ» ÁöÁ¤ÇÒ ¶§´Â ´ÙÀ½°ú °°ÀÌ Á» ´õ °£´ÜÇÏ°Ô Ç¥±âÇÒ ¼ö ÀÖ´Ù.

 

class Memory {

     int[] buffer;

     int size;

     int progress;

     Memory(int asize) {

          size = asize;

          buffer = new int[asize];

          progress = 0;

     }

 

     synchronized void DownChunk(int off) {

          for (int chunk = 0;chunk < 2;chunk++) {

              buffer[off+chunk] = off+chunk;

              progress = off+chunk+1;

              try { Thread.sleep(200); } catch (InterruptedException e) { ; }

          }

     }

    

     synchronized void PlayDowned() {

          for (int off = 0;off < progress;off++) {

              System.out.print(buffer[off] + " ");

          }

          System.out.println();

     }

}

 

¸Þ¼­µå ¼±¾ð¹® ¾Õ¿¡ syncronized Å°¿öµå¸¦ ºÙÀ̸é ÀÌ ¸Þ¼­µåÀÇ º»Ã¼ Àüü°¡ this¿¡ ´ëÇØ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÀνĵȴÙ. Áï ´ÙÀ½ µÎ Çü½ÄÀº °°´Ù.

 

void Method() {

             synchronized(this) {

                          // º»Ã¼

             }

}

synchronized void Method() {

             // º»Ã¼

}

 

ÀÌ·¸°Ô ¼±¾ðµÈ ¸Þ¼­µå¸¦ µ¿±âÈ­ ¸Þ¼­µå¶ó°í ÇÑ´Ù. µ¿±âÈ­ ¸Þ¼­µå´Â ¾î¶² ½º·¹µå¿¡¼­ È£ÃâÇϵçÁö Çѹø¿¡ Çϳª¸¸ ½ÇÇàµÉ ¼ö ÀÖ´Ù. DownChunk°¡ ´Ù¿î·Îµå¸¦ ¹Þ°í ÀÖ´Â ÁßÀ̶ó¸é ¾î¶² ½º·¹µå¿¡¼­ È£ÃâÇÏ°Ç PlayDowned´Â ´ë±âÇÑ´Ù.

½º·¹µå ´ë±â

¿¹Á¦ÀÇ ¿ä±¸ »çÇ×À» Á¶±Ý ¹Ù²Ù¾î Play ¸Þ¼­µå´Â ´Ù¿î·Îµå ÁßÀÇ ¹Ì¸® º¸±â¸¦ Àç»ýÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ´Ù¿î·Îµå ¿Ï·áµÈ µ¿¿µ»ó¸¸ Àç»ýÇÑ´Ù°í ÇØ º¸ÀÚ. ´Ù¿î·Îµå°¡ ¿Ï·áµÇ±â Àü¿¡´Â Àç»ýÀ» ½ÃÀÛÇؼ­´Â ¾ÈµÈ´Ù. ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù.

 

class Play extends Thread {

     Memory mem;

     Play(Memory amem) {

          mem = amem;

     }

     public void run() {

        while (mem.progress != mem.size) {;}

 

          for (int off = 0;off < mem.progress;off++) {

              System.out.print(mem.buffer[off] + " ");

          }

          System.out.println();

     }

}

 

run ¸Þ¼­µåÀÇ ¼±µÎ¿¡¼­ ´Ù¿î·Îµå°¡ ¿Ï·áµÉ ¶§±îÁö ºó ·çÇÁ¸¦ µ¹¸ç ±â´Ù¸®¸é µÈ´Ù. ÀÌ·¸°Ô Çصµ ´ë±âÀÇ ¸ñÀûÀº ´Þ¼ºÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ´ë±âÇÏ´Â ½º·¹µå°¡ ºó ·çÇÁ¸¦ µ¹¸®´À¶ó ³Ê¹« ¸¹Àº CPU ½Ã°£À» ¼Ò¸ðÇÑ´Ù. ÀüüÀûÀÎ ´Ù¿î·Îµåµµ ´Ê¾îÁú °ÍÀÌ´Ù. Á» ´õ È¿À²ÀûÀÎ ´ë±â ¹æ¹ýÀÌ ÇÊ¿äÇѵ¥ À̶§´Â ´ÙÀ½ ¸Þ¼­µå¸¦ »ç¿ëÇÑ´Ù.

 

void wait()

void notify()

 

ÀÌ µÎ ¸Þ¼­µå´Â Object ¼Ò¼ÓÀ̹ǷΠ¸ðµç Ŭ·¡½º°¡ ÀÌ ¸Þ¼­µå¸¦ Á¦°øÇÑ´Ù. ÁÖ·Î °øÀ¯ °´Ã¼¿¡ ´ëÇؼ­ ÀÌ ¸Þ¼­µå¸¦ »ç¿ëÇÑ´Ù. wait ¸Þ¼­µå´Â °øÀ¯ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ» ¶§±îÁö ´ë±âÇÑ´Ù. CPU ½Ã°£À» ¼Ò¸ðÇÏÁö ¾ÊÀ¸¸ç ´Ù¸¥ ½º·¹µå·Î ½ÇÇà ½Ã°£À» ¾çº¸ÇÑ´Ù.

notify ¸Þ¼­µå´Â °øÀ¯ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â »óŶó´Â °ÍÀ» ¾Ë¸°´Ù. notify¸¦ È£ÃâÇÏ¸é °øÀ¯ °´Ã¼¸¦ ±â´Ù¸®´ø ½º·¹µå°¡ ½ÇÇàÀ» ½ÃÀÛÇÑ´Ù. µÎ ¹®ÀåÀº ¸ðµÎ µ¿±âÈ­ ºí·Ï¿¡ ÀÖ¾î¾ß Çϸç wait´Â ¿¹¿Ü ¹ß»ý °¡´É¼ºÀÌ ÀÖ¾î try ºí·Ï ¾È¿¡µµ Æ÷ÇԵǾî ÀÖ¾î¾ß ÇÑ´Ù. ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

class DownLoad extends Thread {

     Memory mem;

     DownLoad(Memory amem) {

          mem = amem;

     }

     public void run() {

          for (int off = 0;off < mem.size;off++) {

              mem.buffer[off] = off;

              mem.progress = off + 1;

              try { Thread.sleep(200); } catch (InterruptedException e) { ; }

          }

          synchronized(mem) {  mem.notify(); }

     }

}

 

class Play extends Thread {

     Memory mem;

     Play(Memory amem) {

          mem = amem;

     }

     public void run() {

          try {

              synchronized(mem) {  mem.wait();  }

          } catch(InterruptedException e) { }

 

          for (int off = 0;off < mem.progress;off++) {

              System.out.print(mem.buffer[off] + " ");

          }

          System.out.println();

     }

}

 

ÃÖÃÊ µÎ ½º·¹µå°¡ µ¿½Ã¿¡ ½ÇÇàµÇÁö¸¸ mem °øÀ¯ °´Ã¼°¡ ¾ÆÁ÷ ´ú ¸¸µé¾îÁ³À¸¹Ç·Î Play ½º·¹µå´Â ÀÌ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ» ¶§±îÁö ´ë±âÇÑ´Ù. DownLoad ½º·¹µå´Â ´Ù¿î·Îµå¸¦ ´Ù ¹ÞÀº ÈÄ memÀÇ notify¸¦ È£ÃâÇÏ¿© ÀÌ °øÀ¯ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ½À» ¾Ë¸°´Ù. Play ½º·¹µå´Â µ¿¿µ»óÀ» ´Ù ¹ÞÀº ÈÄ¿¡³ª Àç»ýÀ» ½ÃÀÛÇÒ °ÍÀÌ´Ù.

wait ¸Þ¼­µåÀÇ Àμö·Î ŸÀÓ ¾Æ¿ôÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ŸÀÓ ¾Æ¿ôÀÌ °æ°úµÇ¾îµµ °øÀ¯ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ¾ø´Â »óÅÂÀÌ¸é ´õ ÀÌ»ó ´ë±âÇÏÁö ¾Ê°í ±×³É ¸®ÅÏÇÑ´Ù. ¿©·¯ °³ÀÇ ½º·¹µå°¡ ÇϳªÀÇ °øÀ¯ °´Ã¼¸¦ ±â´Ù¸®°í ÀÖÀ» ¼öµµ ÀÖ´Ù. ÀÌ »óȲ¿¡¼­ notify¸¦ È£ÃâÇϸé ÃÖÃÊ·Î ½ÇÇàµÇ´Â ½º·¹µå Çϳª¸¸ ±ú¾î³­´Ù. ÀÌ¿¡ ºñÇØ notifyAll ¸Þ¼­µå´Â °øÀ¯ °´Ã¼¸¦ ±â´Ù¸®´Â ¸ðµç ½º·¹µå¿¡°Ô ÇѲ¨¹ø¿¡ ½ÅÈ£¸¦ º¸³½´Ù.

ÀÚ¹Ù 5.0¿¡¼­ »õ·Î Ãß°¡µÈ getState ¸Þ¼­µå´Â ½º·¹µåÀÇ ÇöÀç »óŸ¦ Á¶»çÇϴµ¥ ½Ã½ºÅÛ »óŸ¦ ¸ð´ÏÅ͸µ Çϴµ¥ ÁÖ·Î »ç¿ëµÈ´Ù. suspend, resume, stop µîÀÇ ¸Þ¼Òµå´Â ½º·¹µå¸¦ ÀϽà ÁßÁö, Àç°³, ÁßÁö ½ÃÅ°´Âµ¥ µ¥µå¶ôÀÇ À§ÇèÀÌ ÀÖÀ¸¹Ç·Î Áö±ÝÀº »ç¿ëÀÌ ±ÇÀåµÇÁö ¾Ê´Â´Ù. ÀÌ ¸Þ¼Òµå ´ë½Å º¯¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.