Thread

Thread(์“ฐ๋ ˆ๋“œ)

Thread๋ž€


์ปดํ“จํ„ฐ OS์—์„  ํ”„๋กœ์„ธ์Šค์— ๋ฉ€ํ‹ฐํ…Œ์Šคํ‚น์„ ์ง€์›ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ์ปดํ“จํ„ฐ๋Š” ๋ฉ€ํ‹ฐํ…Œ์Šคํ‚น์„ ์ง€์›ํ•˜์ง€ ์•Š๊ณ 
ํ•œ๊ฐ€์ง€์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ(์‚ฌ๋žŒ์ด ์ธ์ง€ ํ•  ์ˆ˜ ์—†๋Š” ์†๋„) ์ฒ˜๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ๋ ค ๋ฉ€ํ‹ฐํ…Œ์Šคํ‚น์ด ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์ด๊ฒƒ์€ java ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๊ฒƒ์„ Thread๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ผ๊ณ ๋„ ํ•œ๋‹ค.

Thread์˜ ์žฅ์ ์œผ๋กœ๋Š”

  • ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ๋กœ ์ธํ•œ ์ž์›์†Œ๋ชจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋™์‹œ์— ๋‘๊ฐ€์ง€์— ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค(๋ฉ€ํ‹ฐ ํ…Œ์Šคํ‚น)

Thread์˜ ๋‹จ์ ์œผ๋กœ๋Š”

  • Thread๋ผ๋ฆฌ์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋‚œ์žกํ•ด์„œ ๋ฒ„๊ทธ ํ™•๋ฅ ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.

Thread์˜ ์ˆœํ™˜


Thread๋Š” Life Cycle์˜ ์ˆœํ™˜์„ ํ†ตํ•ด ์‹คํ–‰์ด ๋˜๋Š”๋ฐ

1. Runnable (์ค€๋น„์ƒํƒœ)

์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. CPU๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ์ง€์•Š์œผ๋ฉฐ ์‹คํ–‰(Running ์ƒํƒœ)์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ฝ”๋”ฉ ์ƒ์—์„œ start( ) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด run( ) ๋ฉ”์†Œ๋“œ์— ์„ค์ •๋œ ์Šค๋ ˆ๋“œ๊ฐ€ Runnable ์ƒํƒœ๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. โ€œReadyโ€œ ์ƒํƒœ๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

2. Running (์‹คํ–‰์ƒํƒœ)

CPU๋ฅผ ์ ์œ ํ•˜์—ฌ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๋ฉฐ run() ๋ฉ”์„œ๋“œ๋Š” JVM๋งŒ์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Runnable(์ค€๋น„์ƒํƒœ)์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ์ค‘ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด JVM์ด ์ž๋™์œผ๋กœ run( ) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ๊ฐ€ Running ์ƒํƒœ๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.

3. Dead (์ข…๋ฃŒ์ƒํƒœ)

Running ์ƒํƒœ์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋˜๊ณ  ๋‚œ ํ›„ ์™„๋ฃŒ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. โ€œDoneโ€ ์ƒํƒœ๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

4. Blocked (์ง€์—ฐ ์ƒํƒœ)

CPU๋ฅผ ์ ์œ ๊ถŒ์„ ์ƒ์‹คํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ํ›„์— ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ Runnable(์ค€๋น„์ƒํƒœ)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

wait( ) ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด Blocked ์ƒํƒœ๊ฐ€ ๋œ ์Šค๋ ˆ๋“œ๋Š” notify( ) ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด Runnable ์ƒํƒœ๋กœ ๊ฐ‘๋‹ˆ๋‹ค. sleep(์‹œ๊ฐ„) ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด Blocked ์ƒํƒœ๊ฐ€ ๋œ ์Šค๋ ˆ๋“œ๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด Runnable ์ƒํƒœ๋กœ ๊ฐ‘๋‹ˆ๋‹ค.

Thread์˜ ์ƒ์„ฑ๊ณผ ์ ์šฉ


Thread๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹œ์ž‘ํ•˜๋ ค๋ฉด Method Start()๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด๊ฒƒ์€ Thread Class์— ์žˆ๋‹ค.

๋ฐฉ๋ฒ•์œผ๋กœ๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ 1. Thread๋ฅผ extends๋กœ ์ƒ์†๋ฐ›์•„ start()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

class A extends Thread{
    A thd = new A();
    thd.start();
}

2. Runnable interface๋ฅผ ๊ตฌํ˜„(์ƒ์†?)ํ•˜์—ฌ Thread(Runnable e)์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™” ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

class B implements Runnable{
    B b = new B();
    Thread thd = new Thread();
    thd.strat();
}

Thread์˜ ์šฐ์„ ์ˆœ์œ„


sleep() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์ด ์žˆ๋Š”๋ฐ Thread๋Š” ๋ฌด์ฐจ๋ณ„์  ์ˆœ์„œ๋กœ ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ฒซ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ „์‚ฐ์€ quote๋ฐฉ์‹์„ ๊ฐ€์ ธ ๋žœ๋ค์ด ์•„๋‹Œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Field๊ฐ’์œผ๋กœ MAX, MIN , NORM์ด ์žˆ๋‹ค.

//Field
    static final MAX_PRIORITY = 10;
    static final NORM_PRIORITY = 5;
    static final MIN_PRIORITY = 1;

method setPriority()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ์–ด๋А์ •๋„ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

//main
    t1.setPriority(Thread.MAX_PRIORITY);
    t2.setPriority(Thread.MIN_PRIORITY);
    t3.setPriority(Thread.NORM_PRIORITY);

    t1.start();
    t2.start();
    t3.start();

//result
    //t2 ==> t3 ==> t1 ์ˆœ์„œ๋กœ ์‹œ์ž‘
    //ํ•˜์ง€๋งŒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ๋ฟ ์ ˆ๋Œ€์ ์ธ ์ˆœ์œ„๋Š” ์•„๋‹ˆ๋‹ค

Synchronized


Thread์˜ ์žฅ์ ์œผ๋กœ๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ํ•œ Thread์—์„œ method์— ์ ‘๊ทผํ•˜์—ฌ ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝํ• ๋•Œ ๋งŒ์•ฝ ๋‹ค๋ฅธ Thread์—์„œ ์ ‘๊ทผ์„ ํ•œ๋‹ค๋ฉด
๋ถ„๋ช… ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.
์ด๊ฒƒ์€ ์‹ค์ƒํ™œ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ excel ํŒŒ์ผ์„ ๊ณต์œ ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ๋Š” ๋„์ค‘์— ๋‹ค๋ฅธ ๊ณณ์—์„œ
๊ณต์œ ํ•œ excel์— ์ ‘๊ทผํ•˜์—ฌ ๋˜ ์ˆ˜์ •์„ํ•˜๊ฒŒ๋˜๋ฉด ํŒŒ์ผ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.
์ด๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

java๋Š” ์ด๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Synchronized๋ฅผ ์ง€์›ํ•œ๋‹ค.

//method ์ „์ฒด ์˜์—ญ์„ ์ง€์ •
public synchronized void method(){
    //.....
}
//ํŠน์ •ํ•œ ์˜์—ญ์„ ์ง€์ •
synchronized (๋งค๊ฐœ๋ณ€์ˆ˜ ){
    //.....
}

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ KEY๋ฅผ ์ƒ ์„ฑํ•˜๋Š”๋ฐ ๋งŒ์•ฝ Thread๊ฐ€ synchronized์˜ ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด KEY๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
Thread๊ฐ€ Running์—์„œ ๋‚˜์™€ ๋‹ค๋ฅธ Thread๊ฐ€ ์‹คํ–‰์ด ๋˜๋”๋ผ๋„ KEY๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— method์™€ ํŠน์ • ์˜์—ญ์—๋Š” ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.
์ ‘๊ทผํ•˜์ง€ ๋ชปํ•œ Thread๋Š” Synchronized Pool์ด๋ผ๋Š” ์˜์—ญ์— ๋“ค์–ด๊ฐ€๊ฒŒ๋˜์–ด KEY๋ฅผ ๊ฐ€์ง„ Thread๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•œ ํ›„ ๋‹ค์‹œ Thread ์ˆœํ™˜์— ๋“ค์–ด๊ฐ€๊ฒŒ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Thread์˜ ๊ณต์œ ๋ฅผ ํ†ตํ•œ ์ถฉ๋Œ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ž˜๋ชปํ•˜์—ฌ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด KEY๋ฅผ ๊ฐ€์ง„ Thread๊ฐ€ ๋ฌดํ•œ๋ฐ˜๋ณต๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋‹ค๋ฅธ Thread๊ฐ€
์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํ•ญ์ƒ ์ฃผ์˜ํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

Categories:

Updated:

Leave a comment