ÀÚ¹Ù´Â ¾ð¾î Â÷¿ø¿¡¼ ¸ÖƼ ½º·¹µå¸¦ Áö¿øÇÑ´Ù. 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 ÀÎÅÍÆäÀ̽ºÀÇ 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 µîÀÇ ¸Þ¼Òµå´Â ½º·¹µå¸¦ ÀϽà ÁßÁö, Àç°³, ÁßÁö ½ÃÅ°´Âµ¥ µ¥µå¶ôÀÇ À§ÇèÀÌ ÀÖÀ¸¹Ç·Î Áö±ÝÀº »ç¿ëÀÌ ±ÇÀåµÇÁö ¾Ê´Â´Ù. ÀÌ ¸Þ¼Òµå ´ë½Å º¯¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.