20-1.¸ÖƼ ½º·¹µå

20-1-1.½ÇÇà È帧

½º·¹µå´Â Äڵ尡 ½ÇÇàµÇ´Â È帧À̸ç ÀÌ ¾È¿¡¼­ ´ëÀÔ¹®, Á¶°Ç¹®, ·çÇÁ, ¸Þ¼­µå È£Ãâ µîÀÌ ¼øÂ÷ÀûÀ¸·Î ½ÇÇàµÈ´Ù. Æù ³ëÀ̸¸Çü ÄÄÇ»ÅÍ´Â ¿øÄ¢ÀûÀ¸·Î ÇÑ ¹ø¿¡ ÇϳªÀÇ Àϸ¸ ÇÒ ¼ö ÀÖÀ¸¸ç ¼ø¼­¸¦ ¾î±æ ¼ö ¾ø´Ù. º¸ÅëÀÇ ÇÁ·Î±×·¥Àº mainÀ¸·ÎºÎÅÍ ½ÃÀ۵Ǵ ÇϳªÀÇ ½ÇÇà È帧¸¸ °¡Áö¸ç ¼Ò½º¿¡ ±â·ÏµÈ Äڵ带 ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÇÏ´Â ½Ì±Û ½º·¹µå ±¸Á¶ÀÌ´Ù.

¿©·¯ °³ÀÇ ÀÛ¾÷À» µ¿½Ã¿¡ ÇÒ °æ¿ì ŸÀ̸ӳª ¾ÆÀ̵é ŸÀÓ µîÀÇ Æí¹ýÀ» ¾²±âµµ ÇÏÁö¸¸ ÀüüÀûÀÎ ¼Óµµ°¡ ÀúÇÏµÇ°í ¹ÝÀÀ¼ºµµ ¶³¾îÁø´Ù. ÀÌ¿¡ ºñÇØ ¸ÖƼ ½º·¹µå´Â ½ÇÇà È帧À» ¿©·¯ °³ °¡Áö´Â ±¸Á¶ÀÌ´Ù. ¸ÞÀÎ ½º·¹µå¿¡¼­ ÇÊ¿äÇÒ ¶§¸¶´Ù ½º·¹µå¸¦ Ãß°¡·Î »ý¼ºÇÏ¿© ÀÛ¾÷À» ºÐ´ã½ÃŲ´Ù. º¹¼ö °³ÀÇ Äڵ尡 µ¿½Ã ´Ù¹ßÀûÀ¸·Î ½ÇÇàµÇ¾î ¿©·¯ °¡Áö ÀÏÀ» º´·Ä ó¸®ÇÒ ¼ö ÀÖ´Ù.

¿î¿µÃ¼Á¦´Â CPUÀÇ ½Ã°£À» Àß°Ô Á¶±ú ±³´ë·Î ½º·¹µå¸¦ ½ÇÇàÇÏ¿© µ¿½Ã¿¡ ¿©·¯ °¡Áö ÀÏÀ» ó¸®ÇÏ´Â °Íó·³ Èä³»³»´Âµ¥ ÀÌ·± ¹æ½ÄÀ» ¶ó¿îµå ·ÎºóÀ̶ó°í ÇÑ´Ù. º´·Ä¼ºÀÌ Çâ»óµÇ´Â ÀÌÁ¡ÀÌ ÀÖÁö¸¸ CPUÀÇ ¼Óµµ°¡ À¯ÇÑÇÏ°í ÀÛ¾÷ ÀüȯÀ¸·Î ÀÎÇØ ÀüüÀûÀÎ ¼º´ÉÀº ¿ÀÈ÷·Á ¶³¾îÁú ¼öµµ ÀÖ´Ù. Äھ ¿©·¯ °³ÀÎ CPU´Â ½º·¹µå ó¸® ´É·ÂÀÌ Å¹¿ùÇÏ¿© ¸ÖƼ ½º·¹µå¸¦ È°¿ëÇÏ´Â °ÍÀÌ È°½ÇÈ÷ À¯¸®ÇÏ´Ù.

¸ÖƼ ½º·¹µå »ç¿ë ¿©ºÎ´Â ÇÁ·Î±×·¥ÀÇ Æ¯¼º¿¡ µû¶ó °áÁ¤ÇÑ´Ù. ¹é±×¶ó¿îµå ÀÛ¾÷ÀÌ ¸¹À» ¶§ ÀûÇÕÇÏ¸ç »ç¿ëÀÚ¸¦ ´ë¸éÇÏ´Â ÀÛ¾÷Àº ½Ì±Û ½º·¹µå°¡ ¾î¿ï¸°´Ù. °³¹ß°ú Å×½ºÆ®°¡ ¾î·Á¿ö ³ôÀº ¼÷·Ãµµ¸¦ ¿äÇÏ¸ç ±Ô¸ð°¡ Ä¿Áö¸é µ¿±âÈ­°¡ °ñÄ¡ ¾ÆÇÁ´Ù.

ÆíÁý±â·ù³ª ¸ÖƼ¹Ìµð¾î, À¥ ºê¶ó¿ìÀú µîÀÇ ÀϹÝÀûÀÎ ÀÀ¿ë ÇÁ·Î±×·¥µµ ¸ÖƼ ½º·¹µå¸¦ Àû±Ø È°¿ëÇÏ´Â Ãß¼¼ÀÌ´Ù. ƯÈ÷ Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ó¸®ÇÏ´Â ¼­¹ö ÇÁ·Î±×·¥Àº ´ÙÁß Á¢¼ÓÀ» ¿øÈ°È÷ ó¸®Çϱâ À§ÇØ ¸ÖƼ ½º·¹µå°¡ ÇʼöÀûÀÌ´Ù. ÁÖ·Î ¼­¹ö °³¹ß¿¡ È°¿ëµÇ´Â ÀÚ¹Ù ¾ð¾îÀÇ Æ¯¼º»ó ¸ÖƼ ½º·¹µå´Â ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÏ´Â ±â¼úÀÌ´Ù.

¸ÖƼ ½º·¹µå´Â ¾ð¾îÀÇ ±â´ÉÀÌ ¾Æ´Ï¶ó ÇÁ·Î±×·¥À» ±¸µ¿ÇÏ´Â ¿î¿µÃ¼Á¦ÀÇ ±â´ÉÀÌ´Ù. ¹ü¿ë ¾ð¾îÀÎ C++Àº ¸ÖƼ ½º·¹µå¿¡ ¾ÈÁ¤ÀûÀÎ ±¸Á¶¸¸ Á¦°øÇÒ »Ó ¸ÖƼ ½º·¹µå ±â´É ÀÚü´Â Á¦°øÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ÀÚ¹Ù´Â ½ÇÇà ȯ°æÀÎ °¡»ó ¸Ó½ÅÀÌ Ç÷§Æû Â÷¿ø¿¡¼­ ¸ÖƼ ½º·¹µå¸¦ Áö¿øÇÑ´Ù. °¡»ó ¸Ó½ÅÀÌ ¹Ì´Ï ¿î¿µÃ¼Á¦¿©¼­ ÁÖ °³¹ß ¾ð¾îÀÎ ÀÚ¹Ùµµ ½º·¹µå¸¦ Á÷Á¢ Áö¿øÇÑ´Ù.

20-1-2.Thread

ÀÚ¹Ù ÇÁ·Î±×·¥Àº main¿¡¼­ ½ÃÀÛÇϸç mainÀÌ ÁÖ ½º·¹µåÀÌ´Ù. ÃÖÃÊ ½ÇÇàµÉ ¶§´Â ÁÖ ½º·¹µå Çϳª¹Û¿¡ ¾øÁö¸¸ ¹é±×¶ó¿îµå ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ ¶§ Ãß°¡·Î ½º·¹µå¸¦ ´õ ¸¸µç´Ù. ½º·¹µåµµ ÇϳªÀÇ Å¬·¡½º·Î Ç¥ÇöµÈ´Ù. ½º·¹µå °ü·Ã ±â´ÉÀº Thread Ŭ·¡½º¿¡ ĸ½¶È­µÇ¾î ÀÖÀ¸¸ç »ý¼ºÀÚ´Â ´ÙÀ½°ú °°´Ù. ¿É¼ÇÀ¸·Î À̸§À» ÁÙ ¼ö ÀÖÁö¸¸ Àß »ç¿ëµÇÁö´Â ¾Ê´Â´Ù.

 

Thread([String name])

Thread(Runnable target, [String name])

 

Thread Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹Þ°í run ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© ½ÇÇàÇÒ Äڵ带 ±â¼úÇÑ´Ù. run ¸Þ¼­µå´Â ½º·¹µåÀÇ ÁøÀÔÁ¡ÀÌ¸ç ½º·¹µåÀÇ mainÀÌ´Ù. run¿¡¼­ ÀÛ¾÷À» ó¸®Çϸç runÀÌ ¸®ÅÏÇÏ¸é ½º·¹µåµµ Á¾·áµÈ´Ù. ½Ã½ºÅÛ¿¡ ÀÇÇØ ¿ÜºÎ¿¡¼­ È£ÃâµÇ¹Ç·Î ¹Ýµå½Ã publicÀ̾î¾ß Çϸç Àμöµµ ¸®ÅÏ°ªµµ ¾ø´Ù.

 

public void run()

 

½º·¹µå Ŭ·¡½º¸¦ Á¤ÀÇÇÑ ÈÄ main¿¡¼­ ½º·¹µå °´Ã¼¸¦ »ý¼ºÇÑ´Ù. »ý¼º ÈÄ¿¡ À̸§À̳ª ¿ì¼±¼øÀ§ µîÀÇ ¼Ó¼ºÀ» º¯°æÇÒ ¼ö ÀÖÁö¸¸ µðÆúÆ®°¡ ¹«³­ÇØ ²À Á¶Á¤ÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ½º·¹µå °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ ´ÙÀ½ ¸Þ¼­µå·Î ±âµ¿ÇÑ´Ù.

 

void start()

 

start´Â ½º·¹µå¸¦ À§ÇÑ ³»ºÎÀûÀÎ °ü¸® °´Ã¼¿Í È£Ãâ ½ºÅÃÀ» »ý¼ºÇÏ¿© ½ÇÇà ´ë±â »óÅ·Π¸¸µé¾î µÎ¸ç ½Ã½ºÅÛÀº Àû´çÇÑ ¶§¿¡ run ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© »õ·Î¿î ½ÇÇà È帧À» ±âµ¿½ÃŲ´Ù. ÀÌÈÄ ¸ÞÀÎ ½º·¹µå¿Í ÀÛ¾÷ ½º·¹µå´Â º°µµÀÇ ½ÇÇà È帧À» °¡Áö¸ç º´·ÄÀûÀ¸·Î ½ÇÇàµÈ´Ù.

¹é±×¶ó¿îµå ÀÛ¾÷À» ó¸®ÇÏ´Â ½º·¹µå´Â ½ÇÇà ¸ð½ÀÀÌ º¸ÀÌÁö ¾Ê´Â °æ¿ì°¡ ¸¹´Ù. ÇнÀÀ» À§ÇÑ ¿¹Á¦¿¡¼­´Â ½º·¹µåÀÇ µ¿ÀÛÀ» ´«À¸·Î È®ÀÎÇØ¾ß ÇϹǷΠ¹®ÀÚ¸¦ ¹Ýº¹ÀûÀ¸·Î Ãâ·ÂÇÏ¿´´Ù. ÅؽºÆ® ȯ°æÀ̶ó ´ú Á÷°üÀûÀε¥ ±×·¡ÇÈ È¯°æÀ̶ó¸é ¾Ö´Ï¸ÞÀ̼ÇÀ̳ª »ç¿îµå Àç»ý µîµµ ó¸®ÇÒ ¼ö ÀÖ´Ù.

 

thread

class JavaTest {

     public static void main(String[] args) {

          PrintThread worker = new PrintThread();

          worker.start();

         

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

              System.out.print("O");

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

          }

     }

}

 

class PrintThread extends Thread {

     public void run() {

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

              System.out.print("X");

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

          }

     }

}

½ÇÇà°á°ú

XOXXOXXOXXOXXOXXXOXOXXOXXOXXOXXXOXOXXOXXOXXXOOOOOOOOOOOOOOOO

 

main¿¡¼­ ½ÃÀÛÇÏ´Â ÁÖ½º·¹µå´Â 0.2ÃÊ¿¡ ÇÑ ¹ø¾¿ O ¹®ÀÚ¸¦ Ãâ·ÂÇÑ´Ù. ÀÔ·ÂÀ» ¹Þ°Å³ª È­¸é UI¸¦ °»½ÅÇÏ´Â ÀÛ¾÷À̶ó°í °¡Á¤ÇÏÀÚ. ¹é±×¶ó¿îµå¿¡¼­ ó¸®ÇÒ ÀÛ¾÷ÀÌ ÀÖ´Ù¸é ½º·¹µå¸¦ Çϳª ´õ »ý¼ºÇÑ´Ù. Thread·ÎºÎÅÍ »ó¼Ó¹ÞÀº PrintThread Ŭ·¡½º¸¦ ¼±¾ðÇÏ°í run ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© 0.1ÃÊ¿¡ ÇÑ ¹ø¾¿ X ¹®ÀÚ¸¦ Ãâ·ÂÇÑ´Ù. º¹ÀâÇÑ ¼öÇÐÀû °è»êÀ̳ª ³×Æ®¿÷ ÀÔÃâ·Â ÀÛ¾÷À̶ó°í °¡Á¤ÇÏÀÚ.

Áß°£¿¡ »ðÀÔµÈ sleep ¹®ÀåÀº °á°ú¸¦ õõÈ÷ »ìÆ캸±â À§ÇØ ÀǵµÀûÀ¸·Î »ðÀÔÇÑ °ÍÀÌ´Ù. ½º·¹µå Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í main¿¡¼­ ½º·¹µå °´Ã¼ worker¸¦ »ý¼ºÇÑ´Ù. ±×¸®°í start ¸Þ¼­µå¸¦ È£ÃâÇÏ¸é ½º·¹µå°¡ ±âµ¿µÇ¾î ½ÇÇàÀ» ½ÃÀÛÇÑ´Ù. ÀÛ¾÷ ½º·¹µå°¡ µ¿ÀÛÀ» ½ÃÀÛÇÏ¿© 2°³ÀÇ ½º·¹µå°¡ µ¿½Ã¿¡ ½ÇÇàµÈ´Ù.

ÁÖ ½º·¹µå´Â O¸¦ Âï°í ÀÛ¾÷ ½º·¹µå´Â X¸¦ Âï´Â´Ù. O¿Í X°¡ ¹ø°¥¾Æ Ãâ·ÂµÇ¾î µÎ ½º·¹µå°¡ ±³´ë·Î ½ÇÇàµÊÀ» ½Ã°¢ÀûÀ¸·Î È®ÀÎÇÒ ¼ö ÀÖ´Ù. CPU´Â ½Ã°£À» °øÆòÇÏ°Ô ºÐ¹èÇÏÁö¸¸ ÀÛ¾÷ ½º·¹µå´Â 0.1ÃÊ ½¬°í ÁÖ ½º·¹µå´Â 0.2ÃÊ ½¬¾î ÀÛ¾÷ ½º·¹µå°¡ ´õ ¸¹Àº ½Ã°£À» »ç¿ëÇÏ¸ç ´õ »¡¸® ³¡³½´Ù.

µÎ ½º·¹µå°¡ ¸ðµÎ ½ÇÇàÀ» ¸¶Ä¡¸é ÇÁ·Î±×·¥µµ Á¾·áµÈ´Ù. ÀÌ ¿¹Á¦¸¦ ½Ì±Û ½º·¹µå·Î ´Ù½Ã ÀÛ¼ºÇØ º¸ÀÚ. ±×·¯¸é main¿¡¼­ ½ÃÀÛÇÏ´Â ÁÖ ½º·¹µå¿¡¼­ O Ãâ·Â°ú X Ãâ·ÂÀ» ¸ðµÎ ó¸®ÇØ¾ß ÇÑ´Ù.

 

singlethread

class JavaTest {

     public static void main(String[] args) {

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

              System.out.print("O");

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

          }

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

              System.out.print("X");

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

          }

     }

}

½ÇÇà°á°ú

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

ÇÑ ½º·¹µå¿¡¼­´Â ÀÛ¾÷À» ¼øÂ÷ÀûÀ¸·Î ó¸®ÇÏ´Ï O¸¦ ´Ù Ãâ·ÂÇÑ ÈÄ¿¡¾ß X°¡ Ãâ·ÂµÈ´Ù. ÀüüÀûÀΠó¸® ½Ã°£Àº °°Áö¸¸ º´·Ä 󸮰¡ ¾ÈµÈ´Ù. ÀÌ ¿¹¸¦ ÅëÇØ ½Ì±Û ½º·¹µå¿Í ¸ÖƼ ½º·¹µå°¡ ¾î¶»°Ô ´Ù¸¥Áö, ¿Ö ¸ÖƼ ½º·¹µå¸¦ ½á¾ß ÇÏ´ÂÁö °¨À» ÀâÀ» ¼ö ÀÖ´Ù. µÎ °¡Áö ÀÌ»óÀÇ ÀÛ¾÷À» µ¿½Ã¿¡ ó¸®Çϱâ À§ÇØ ½º·¹µå¸¦ »ç¿ëÇÑ´Ù.

20-1-3.Runnable

Thread Ŭ·¡½º¸¦ »ó¼Ó¹Þ´Â ¹æ¹ýÀÌ Á¦ÀÏ °£´ÜÇÏÁö¸¸ ÀÚ¹Ù ¾ð¾îÀÇ Æ¯¼º»ó »ó¼ÓÀÌ ¾î·Á¿î °æ¿ìµµ ÀÖ´Ù. ÀÌ·² ¶§´Â run ¸Þ¼­µå¸¦ Á¤ÀÇÇÏ´Â Runnable ÀÎÅÍÆäÀ̽ºÀÇ ±¸Çö Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í ÀÌ Å¬·¡½ºÀÇ °´Ã¼¸¦ ThreadÀÇ »ý¼ºÀÚ·Î Àü´ÞÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. run ¸Þ¼­µå¸¦ ´©°¡ ±¸ÇöÇϴ°¡ÀÇ Â÷À̸¸ ÀÖÀ» »Ó °ÅÀÇ °°Àº ¹æ¹ýÀÌ´Ù.

 

runnable

class JavaTest {

     public static void main(String[] args) {

          PrintRunnable print = new PrintRunnable();

          Thread worker = new Thread(print);

          worker.start();

         

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

              System.out.print("O");

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

          }

     }

}

 

class PrintRunnable implements Runnable {

     public void run() {

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

              System.out.print("X");

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

          }

     }

}

 

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

½º·¹µå¸¦ »ý¼ºÇÏ´Â Çü½Ä¸¸ ´Ù¸¦ »Ó run ¸Þ¼­µåÀÇ ÄÚµå´Â °°¾Æ ½ÇÇà °á°úµµ µ¿ÀÏÇÏ´Ù. °á±¹ ¾î¶² ¹æ¹ýÀ» ¾²°Ç ½º·¹µåÀÇ ÀÛ¾÷ Äڵ带 °¡Áö´Â void run() ¸Þ¼­µå¸¦ Á¤ÀÇÇÏ°í ½Ã½ºÅÛÀ¸·Î ÇÏ¿©±Ý ÀÌ ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© ½º·¹µå¸¦ ±âµ¿ÇÏ°Ô ¸¸µç´Ù.

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

 

runnable2

class JavaTest {

     public static void main(String[] args) {

          PrintRunnable print = new PrintRunnable();

          Thread worker = new Thread(print);

          worker.start();

         

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

              System.out.print("O");

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

          }

     }

}

 

class PrintClass {

     public void printChar() {

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

              System.out.print("X");

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

          }

     }

}

 

class PrintRunnable extends PrintClass implements Runnable {

     public void run() {

          printChar();

     }

}

 

PrintClassÀÇ printChar ¸Þ¼­µå´Â X ¹®ÀÚ¸¦ ¹Ýº¹ÀûÀ¸·Î Ãâ·ÂÇÑ´Ù. ÀÌ Å¬·¡½º¸¦ »ó¼Ó¹Þ¾Æ ÀçÁ¤ÀÇÇÑ ÈÄ º°µµÀÇ ½º·¹µå¿¡¼­ ½ÇÇàÇÏ°í ½Í´Ù°í ÇÏÀÚ. PrintClass¸¦ ¼öÁ¤ÇÏ·Á¸é ÀÌ Å¬·¡½º¸¦ »ó¼Ó¹Þ¾Æ¾ß ÇÏ°í ½º·¹µå¿¡¼­ ½ÇÇàÇÏ°í ½ÍÀ¸¸é Thread·ÎºÎÅÍ »ó¼Ó¹Þ¾Æ¾ß ÇÑ´Ù. ¿øÇϴ´ë·Î ÇÏÀÚ¸é ´ÙÀ½ ±¸¹®ÀÌ ÇÊ¿äÇÏ´Ù.

 

class PrintThread extends PrintClass, Thread {

 

¾ÈŸ±õ°Ôµµ ÀÚ¹Ù´Â µÎ °³ÀÇ ºÎ¸ð Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹Þ´Â ´ÙÁß »ó¼ÓÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ run ¸Þ¼­µå¸¦ °¡Áö´Â ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Æ run ¸Þ¼­µå¸¦ ±¸ÇöÇÑ´Ù. ÀÎÅÍÆäÀ̽º´Â °³¼ö¿¡ »ó°ü¾øÀÌ ¾ó¸¶µçÁö ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

PrintRunnable Ŭ·¡½º´Â ¹®ÀÚ¸¦ Ãâ·ÂÇÏ´Â PrintClass¸¦ »ó¼Ó¹ÞÀ¸¸é¼­ ½º·¹µåÀÇ ÁøÀÔÁ¡ÀÎ run ¸Þ¼­µå¸¦ °¡Áø´Ù. main¿¡¼­ ÀÌ °´Ã¼¸¦ »ý¼ºÇÏ¿© ThreadÀÇ »ý¼ºÀÚ·Î ³Ñ±â¸ç ½Ã½ºÅÛÀº ÀÌ °´Ã¼ÀÇ run ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© ½º·¹µå¸¦ ±âµ¿½ÃŲ´Ù.

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

 

runnable3

class JavaTest {

     public static void main(String[] args) {

          Thread worker = new Thread(mRunnable);

          worker.start();

         

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

              System.out.print("O");

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

          }

     }

    

     static Runnable mRunnable = new Runnable() {

          public void run() {

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

                   System.out.print("X");

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

              }

          }

     };

}

 

Ŭ·¡½º ¼±¾ð¹®ÀÌ »ç¶óÁ® °£´ÜÇØÁ³´Ù. ·¯³ÊºíÀº µü ÇϳªÀÇ °´Ã¼¸¸ ÇÊ¿äÇϹǷΠ±»ÀÌ °´Ã¼¸¦ »ý¼ºÇÒ ÇÊ¿ä ¾øÀÌ °´Ã¼ »ý¼º¹®À» ThreadÀÇ »ý¼ºÀÚ ¾È¿¡ Áý¾î ³Ö¾î ¹ö¸®¸é ´õ ª°Ô ÁÙÀÏ ¼ö ÀÖ´Ù.

 

runnable4

class JavaTest {

     public static void main(String[] args) {

          Thread worker = new Thread(new Runnable() {

              public void run() {

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

                        System.out.print("X");

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

                   }

              }

          });

          worker.start();

         

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

              System.out.print("O");

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

          }

     }

}

 

±æÀÌ´Â ÈξÀ ª¾ÆÁ³Áö¸¸ ÀÌ·± ±¸¹®À» óÀ½ º¸´Â Ãʺ¸ÀÚ¿¡°Ô´Â »ó´çÈ÷ ³­ÇØÇØ º¸ÀδÙ. ¼÷·ÃÀÚ´Â ÀÌ·± Äڵ带 ¸¹ÀÌ »ç¿ëÇϸç ƯÈ÷ ±×·¡ÇÈ È¯°æ¿¡¼­ ÀÌ·± ½ÄÀÇ Àӽà °´Ã¼¸¦ ¸¹ÀÌ È°¿ëÇÑ´Ù.

20-1-4.¿©·¯ °³ÀÇ ½º·¹µå

»ý¼º °¡´ÉÇÑ ½º·¹µåÀÇ °³¼ö¿¡ ¹°¸®Àû Á¦ÇÑÀº ¾øÁö¸¸ ½º·¹µå °ü¸®¸¦ À§ÇÑ Á¤º¸¿Í È£Ãâ ½ºÅÃÀ» À§ÇØ ¸Þ¸ð¸®¸¦ ¼Ò¸ðÇϱ⠶§¹®¿¡ ¹«ÇÑÈ÷ »ý¼ºÇÒ ¼ö´Â ¾ø´Ù. ¶Ç CPUÀÇ Ã³¸® ¼Óµµ¿¡µµ ÇÑ°è°¡ ÀÖ¾î ³Ê¹« ¸¹ÀÌ ¸¸µé¸é ÀüüÀûÀÎ ¼º´ÉÀÌ ¶³¾îÁø´Ù.

±×·¯³ª Àû¾îµµ ¹®¹ýÀûÀ¸·Î´Â Á¦¾àÀÌ ¾ø¾î ¿øÇϴ¸¸Å­ ¸¸µé¾îµµ »ó°ü¾ø´Ù. ½ÇÁ¦ ¼­¹ö ÇÁ·Î¼¼½º´Â ´ÙÁß »ç¿ëÀÚ¸¦ ´ë±âÇϱâ À§ÇØ ¼ö¹é °³ÀÇ ½º·¹µå¸¦ »ý¼ºÇÏ¿© µ¹¸®±âµµ ÇÑ´Ù. ÀÛ¾÷ ½º·¹µå´Â º¸Åë ¹é±×¶ó¿îµå¿¡¼­ °£´ÜÇÑ ÀÛ¾÷À» Çϰųª ¿ìµÎÄ¿´Ï ¾É¾Æ ¿äûÀ» ´ë±âÇÏ´Â °æ¿ì°¡ ¸¹¾Æ ÁÖ ½º·¹µå¿¡ ºñÇØ CPU ½Ã°£À» ¸¹ÀÌ ¼Ò¸ðÇÏÁö ¾Ê´Â´Ù.

½º·¹µåµµ ÇϳªÀÇ Å¬·¡½ºÀ̹ǷΠ°íÀ¯ÇÑ ¸â¹ö¸¦ °¡Áú ¼ö ÀÖ°í ¸â¹ö¿¡ µû¶ó Á¶±Ý¾¿ ´Ù¸£°Ô µ¿ÀÛÇÒ ¼ö ÀÖ´Ù. ¸¶Ä¡ ¸Þ¼­µå Çϳª·Î Àμö¸¦ ¹Ù²ã°¡¸ç ¿©·¯ °¡Áö ÀÏÀ» ÇÒ ¼ö ÀÖ´Â °Í°ú ¸¶Âù°¡ÁöÀÌ´Ù. ¾Õ¿¡¼­ ¸¸µç PrintThread´Â ¹«Á¶°Ç X¹®ÀÚ¸¦ Ãâ·ÂÇßÁö¸¸ ÀÌ °ªÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇØ º¸ÀÚ.

 

multithread

import java.awt.Toolkit;

 

class JavaTest {

     public static void main(String[] args) {

          PrintThread worker1 = new PrintThread('X');

          worker1.start();

          PrintThread worker2 = new PrintThread('.');

          worker2.start();

          BeepThread beep = new BeepThread(5, 1000);

          beep.start();

         

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

              System.out.print("O");

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

          }

     }

}

 

class PrintThread extends Thread {

     char ch;

     PrintThread(char ch) {

          super();

          this.ch = ch;

     }

     public void run() {

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

              System.out.print(ch);

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

          }

     }

}

 

class BeepThread extends Thread {

     int count;

     int gap;

     Toolkit tool = Toolkit.getDefaultToolkit();

     BeepThread(int count, int gap) {

          this.count = count;

          this.gap = gap;

     }

     public void run() {

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

              tool.beep();

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

          }

     }

}

½ÇÇà°á°ú

.XXO.X.XO.X.X.OX.OX.X.OX.X.O.XX.OX.X.OX..XXO.X.XO.X..OXX.OX.X.O.XX.OX.X.

XO.OOOOOOOOOOOOOOO

 

PrintThread¿¡ ch ¸â¹ö¸¦ ¼±¾ðÇÏ°í »ý¼ºÀÚ¸¦ ÅëÇØ Ãâ·ÂÇÒ ¹®ÀÚ¸¦ Àü´Þ¹Þ¾Æ run ¸Þ¼­µåÀÇ for ·çÇÁ¿¡¼­ ch ¹®ÀÚ¸¦ Âï´Â´Ù. ÀÛ¾÷ ½º·¹µåÀÇ »ý¼ºÀÚ·Î ¾î¶² ¹®ÀÚ¸¦ ³Ñ±â´Â°¡¿¡ µû¶ó Ãâ·ÂµÇ´Â ¹®ÀÚ°¡ ´Þ¶óÁø´Ù. Ãâ·Â °³¼ö, Áö¿¬ ½Ã°£µµ Àμö·Î Àü´ÞÇÏ¿© ½º·¹µå¸¶´Ù ´Ù¸£°Ô ó¸®ÇÒ ¼ö ÀÖ´Ù.

BeepThread´Â »ý¼ºÀÚÀÇ Àμö·Î Àü´Þ¹ÞÀº count Ƚ¼ö¸¸Å­ gap °£°ÝÀ¸·Î ¼Ò¸®¸¦ Ãâ·ÂÇÑ´Ù. ¼Ò¸®´Â Toolkit°´Ã¼ÀÇ beep ¸Þ¼­µå·Î Ãâ·ÂÇϴµ¥ ½ºÇÇÄ¿·Î ¶ò¶òÇϴ û°¢ÀûÀÎ Ãâ·ÂÀ» ³½´Ù. »ç¿îµå ÆÄÀÏÀ» »ç¿ëÇϸé ÀÓÀÇÀÇ ¼Ò¸®¸¦ ³¾ ¼öµµ ÀÖ´Ù.

main¿¡¼­ µÎ °³ÀÇ PrintThread ÀÛ¾÷ ½º·¹µå¸¦ »ý¼ºÇ쵂 °¢°¢ X¿Í . ¹®ÀÚ¸¦ Àü´ÞÇß´Ù. BeepThread´Â ÃÊ´ç ÇÑ ¹ø¾¿ ÃÑ ´Ù¼¸ ¹ø ¼Ò¸®¸¦ ³½´Ù. ¼¼ ÀÛ¾÷ ½º·¹µå¸¦ ±âµ¿½ÃÅ°¸é ÁÖ ½º·¹µå±îÁö ÃÑ ³× °³ÀÇ ½º·¹µå°¡ µ¿½Ã¿¡ ½ÇÇàµÈ´Ù. Äֿܼ¡ ¼¼ °³ÀÇ ¹®ÀÚ°¡ ¹ø°¥¾Æ ³ªÅ¸³ª°í ½ºÇÇÄ¿¿¡¼­´Â ¼Ò¸®°¡ ³­´Ù.

½º·¹µå´Â °´Ã¼ÀÌ¸ç ½ÇÇàÁß¿¡ ¾ó¸¶µçÁö »ý¼ºÇÒ ¼ö ÀÖ´Ù. ¹é±×¶ó¿îµå¿¡¼­ ó¸®ÇÒ ÀÛ¾÷ÀÌ ÀÖ´Ù¸é ½º·¹µå °´Ã¼¸¦ »ý¼ºÇÏ¿© start ¸Þ¼­µå·Î ±âµ¿¸¸ ½ÃÅ°¸é µÈ´Ù. ÀÛ¾÷ ½º·¹µå´Â ¹é±×¶ó¿îµå¿¡¼­ ¹¬¹¬È÷ ÀÚ½ÅÀÇ ÇÒÀÏÀ» ó¸®ÇÏ°í run ¸Þ¼­µå°¡ Á¾·áµÇ¸é Á¶¿ëÈ÷ »ç¶óÁø´Ù.

²À °°Àº Á¾·ùÀÇ ½º·¹µå°¡ ¾Æ´Ï¾îµµ »ó°ü¾ø´Ù. ÀμâÇÏ´Â ½º·¹µå, °è»êÇÏ´Â ½º·¹µå, ³×Æ®¿÷¿¡¼­ ´Ù¿î·Îµå ¹Þ´Â ½º·¹µå¸¦ °¢°¢ ÇÊ¿äÇѸ¸Å­ µ¿½Ã¿¡ ½ÇÇàÇصµ ¹«¸®¾øÀÌ Àß µ¹¾Æ°£´Ù. ¿ÀÇǽº³ª ºê¶ó¿ìÀú µî ¿ì¸®°¡ ´Ã»ó »ç¿ëÇÏ´Â ÇÁ·Î±×·¥µµ ¹é±×¶ó¿îµå¿¡¼­ ¼ö½Ê °³ÀÇ ½º·¹µå¸¦ ½ÇÇàÇÑ´Ù.