ch25 : Thread

๋ชฉ์ฐจ

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

โœ๏ธ ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์™€ ๋‹ค๋ฅด๊ฒŒ, (๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์˜) ์Šค๋ ˆ๋“œ๋“ค๋ผ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ์— ๊ณต๊ฐ„ ํšจ์œจ์ ์ด๊ณ  Context-Swithing์ด ๋น ๋ฅด๋‹ค.

์‹คํ–‰ ๋ฐฉ๋ฒ• - ๋ฉ”์ธ ํ•จ์ˆ˜์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

Runnable ์ธํ„ฐํŽ˜์ด์Šค์™€ Thread ํด๋ž˜์Šค

์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. Runnable ์ธํ„ฐํŽ˜์ด์Šค

  2. Thread ํด๋ž˜์Šค (Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค. ์ฆ‰, ๊ตฌํ˜„ํ•จ)

(๋‘˜๋‹ค java.lang์— ์žˆ์œผ๋ฏ€๋กœ import ์•ˆํ•ด๋„ ๋œ๋‹ค.)

  • Runnable ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” void run() ๋งŒ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ์ˆ˜ํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. โ†’ Thread ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋งŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  • Thread ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•˜๋‹ค.

  • ๊ทธ๋Ÿผ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ? ํด๋ž˜์Šค๋Š” ๋‹ค์ค‘ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค๊ฐ€ Thread ํด๋ž˜์Šค ์™ธ์—๋„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Runnable ์ธํ„ฐํŽ˜์ด์Šค์„ ์ƒ์†๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

์Šค๋ ˆ๋“œ ์‹คํ–‰ ๋ฐฉ์‹

  • ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” run()์ด๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.)

  • ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” start()์ด๋‹ค.

  • ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์€ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.

  • Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์˜ˆ์‹œ

    public class Test implements Runnable {
    
       public void run() {
    	   // ๊ตฌํ˜„
       }
    }
    
    // Runnable ์‹คํ–‰
    RunnableSample runnable = new RunnableSample();
    new Therad(runnable).start(); 
  • Thread ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ ํด๋ž˜์Šค์˜ ์˜ˆ์‹œ

    public class Test extends Thread {
    
     @Override
     public void run() {
    	 // ๊ตฌํ˜„
     }
    }
    
    // Thread ์‹คํ–‰
    ThreadSample thread = new ThreadSample();
    thread.start();  

์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰

  • start()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด run() ๋ฉ”์„œ๋“œ ๋‚ด์šฉ์ด ๋๋‚˜๋“  ๋ง๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ ๋ฉ”์„œ๋“œ์—์„œ ๊ทธ ๋‹ค์Œ ์ค„์ด ์‹คํ–‰๋œ๋‹ค.

  • ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘ํ•  ๋•Œ 100 ์ˆซ์ž๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด? -> ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์†๋ฐ›์€ ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ

  • sleep()

    • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜์–ด์˜จ ์‹œ๊ฐ„๋งŒํผ ๋Œ€๊ธฐํ•œ๋‹ค.

    • ์‚ฌ์šฉํ•  ๋• ํ•ญ์ƒ try-catch๋กœ ๋ฌถ์–ด์ค€๋‹ค. InterrptedException ํ˜น์€ ์ƒ์œ„ ์˜ˆ์™ธ ํด๋ž˜์Šค๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ

  • ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๋Š” JVM์ด ์ข…๋ฃŒํ•  ์ˆ˜ ์—†์œผ๋‚˜, ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” JVM์ด ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ ์‹คํ–‰(start())์ „์— ๋ฐ๋ชฌ์Šค๋ ˆ๋“œ๋กœ ์ง€์ •๋˜์–ด์•ผ ํ•œ๋‹ค.

    • ์Šค๋ ˆ๋“œ๊ฐ์ฒด.setDaemon(true); // ๋ฐ๋ชฌ์Šค๋ ˆ๋“œ ์ง€์ •

  • ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„๋„, ๋‹ค๋ฅธ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ข…๋ฃŒ๋œ๋‹ค.

  • ex) ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์„ ๋ฐ๋ชฌ์Šค๋ ˆ๋“œ๋กœ ๋งŒ๋“ ๋‹ค.

    • ๋ชจ๋‹ˆํ„ฐ๋ง ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ๋ชฌ์Šค๋ ˆ๋“œ๋กœ ๋งŒ๋“ค๊ณ , ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ์Šค๋ ˆ๋“œ๋„ ์ข…๋ฃŒ์‹œ์ผœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋๋‚ด๋Š” ๊ฒฝ์šฐ

Last updated