nyximos.log

[Java] ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณธ๋ฌธ

Programming/JAVA

[Java] ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

nyximos 2022. 9. 6. 20:33

๐Ÿ‘ฉ‍๐Ÿš€ ๋ชฉํ‘œ

์ž๋ฐ”์˜ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜์„ธ์š”.

๐Ÿ‘ฉ‍๐Ÿ’ป ํ•™์Šตํ•  ๊ฒƒ

  • Thread ํด๋ž˜์Šค์™€ Runnable ์ธํ„ฐํŽ˜์ด์Šค
  • ์“ฐ๋ ˆ๋“œ์˜ ์ƒํƒœ
  • ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„
  • Main ์“ฐ๋ ˆ๋“œ
  • ๋™๊ธฐํ™”
  • ๋ฐ๋“œ๋ฝ

 

 

๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น Multi-tasking

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์‹œ์— ์‹คํ–‰ ๐Ÿ‘‰ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ๋†’์ž„.

 

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ Multi-threading

ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—์„œ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž‘์—…์„ ๋™์‹œ์— ํ•˜๋Š” ๊ฒƒ

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์˜ ์žฅ์ 

  • CPU์˜ ์‚ฌ์šฉ๋ฅ ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
  • ์ž์›์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‘๋‹ต์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.
  • ์ž‘์—…์ด ๋ถ„๋ฆฌ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์˜ ๋‹จ์ 

  • ๋™๊ธฐํ™” synchronization 
  • ๊ต์ฐฉ์ƒํƒœ deadlock : ๋ฌดํ•œ ๋Œ€๊ธฐ
  • ๊ธฐ์•„ starvation : ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์„œ ์›ํ•˜๋Š” ์ž์›์„ ๊ณ„์† ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ

 

ํ”„๋กœ์„ธ์Šค process

  • ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ
  • ์ž์› + ์“ฐ๋ ˆ๋“œ
  • ๋…์ž์ ์œผ๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์„ ๊ฐ€์ง„๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด OS๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ์ž์›(๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ํ• ๋‹น๋ฐ›์•„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค.
  • ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๋Š” ์ตœ์†Œํ•œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค multi-threaded process : ๋‘˜ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค

 

์“ฐ๋ ˆ๋“œ thread

  • ๊ฐ๊ฐ์˜ ์ž‘์—…
  • ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์กด์žฌ
  • ๋ฉ”๋ชจ๋ฆฌ์™€ ํŒŒ์ผ์„ ํฌํ•จํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์ž์›์„ ๊ณต์œ 
  • ๋ชจ๋“  ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์–ด๋„ ํ•˜๋‚˜์˜ thread๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • main thread๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ์ถœ๋ฐœํ•œ๋‹ค.

 

 

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

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

1. Thread ํด๋ž˜์Šค ์ƒ์†

Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

 

1. Thread๋ฅผ ์ƒ์†๋ฐ›์•„ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

2. run()  ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค.

3. Thread ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

4. start()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

class MyThread extends Thread{
    public void run() { /* ์ž‘์—…๋‚ด์šฉ */ }  // Thread ํด๋ž˜์Šค์˜ run()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
}

 

2. Runnable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค.

์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ๋ณด๋‹ค ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

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

2. run() ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

3. Thread ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋•Œ ์•„๊นŒ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.

4. start()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. 

class MyThread implements Runnable {
    public void run() { /* ์ž‘์—…๋‚ด์šฉ */ }  // Runnable ์ธํ„ฐํŽ˜์ด์Šค์˜ run() ๊ตฌํ˜„
}

 

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

run() ๋งŒ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

public interface Runnable {
    public abstract void run();
}

 

์“ฐ๋ ˆ๋“œ ๊ตฌํ˜„ & ์‹คํ–‰

public class ThreadTest{
    public static void main(String args[]){
        InheritedThread thread1 = new InheritedThread();
        InheritedThread thread2 = new InheritedThread();


        Runnable r = new RunnableThread();
        Thread thread3 = new Thread(r);
        Thread thread4 = new Thread(r);

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
    }

}

class InheritedThread extends Thread {
    public void run() {
        for(int i=0; i<5; i++){
            System.out.println(getName());
        }
    }
}

class RunnableThread implements Runnable {
    public void run() {
        for(int i=0; i<5; i++){
            System.out.println(Thread.currentThread().getName());
        }
    }
}

๋งค๋ฒˆ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-2
Thread-2
Thread-2
Thread-2
Thread-2
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-3
Thread-3
Thread-3
Thread-3
Thread-3

Process finished with exit code 0

 

 

 

start( )

์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋‹ค๊ฐ€ ์ž์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ๋˜๋ฉด ์‹คํ–‰ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•ด start( )๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ฒˆ ์ด์ƒ ํ˜ธ์ถœ์‹œ IllegalThreadStateException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

sleep(long millis)

์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ผ์‹œ์ •์ง€ ์‹œํ‚จ๋‹ค.

์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ๋‚˜๋ฉด, ์ž๋™์ ์œผ๋กœ ๋‹ค์‹œ ์‹คํ–‰๋Œ€๊ธฐ๊ฐ€ ๋œ๋‹ค.

 

void join( )

์ง€์ •๋œ ์‹œ๊ฐ„๋™์•ˆ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค.

 

void interrupt( )

sleep( ) ์ด๋‚˜ join( ) ์— ์˜ํ•ด ์ผ์‹œ์ •์ง€ ์ƒํƒœ์ธ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ์„œ ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

 

static void yield( )

์‹คํ–‰ ์ค‘์— ์ž์‹ ์—๊ฒŒ ์ฃผ์–ด์ง„ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์–‘๋ณดํ•˜๊ณ  ์ž์‹ ์€ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

 

void stop()

์“ฐ๋ ˆ๋“œ๋ฅผ ์ฆ‰์‹œ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

deprecated

 

void suspend( )

์“ฐ๋ ˆ๋“œ๋ฅผ ์ผ์‹œ์ •์ง€ ์‹œํ‚จ๋‹ค.

resume( )์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์‹œ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

deprecated

 

void resume( )

suspend( )์— ์˜ํ•ด ์ผ์‹œ์ •์ง€์ƒํƒœ์— ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

deprecated

 

 

์“ฐ๋ ˆ๋“œ์˜ ์ƒํƒœ

NEW

์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์•„์ง start()๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์€ ์ƒํƒœ

RUNNABLE

์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ

BLOCKED

๋™๊ธฐํ™” ๋ธ”๋Ÿญ์— ์˜ํ•ด์„œ ์ผ์‹œ์ •์ง€๋œ ์ƒํƒœ

lock์ด ํ’€๋ฆด ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ

WAITING/TIMED_WAITING

์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ

์‹คํ–‰๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์ผ์‹œ์ •์ง€์ƒํƒœ

TIMED_WAITING : ์ผ์‹œ์ •์ง€ ์‹œ๊ฐ„์ด ์ง€์ •๋œ ๊ฒฝ์šฐ ์˜๋ฏธ

TERMINATED

์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ข…๋ฃŒ๋œ ์ƒํƒœ

 

1. ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑํ•˜๊ณ  start( )๊ฐ€ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ ,
    ์‹คํ–‰ ๋Œ€๊ธฐ์—ด์— ์ €์žฅ๋˜์–ด ์ž์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.

    ์‹คํ–‰๋Œ€๊ธฐ์—ด์€ ํ Queue ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋จผ์ € ์‹คํ–‰ ๋Œ€๊ธฐ์—ด์— ๋“ค์–ด์˜จ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

2. ์‹คํ–‰๋Œ€๊ธฐ์ƒํƒœ์— ์žˆ๋‹ค๊ฐ€ ์ž์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ๋˜๋ฉด ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

3. ์ฃผ์–ด์ง„ ์‹คํ–‰์‹œ๊ฐ„์ด ๋‹ค ๋˜๊ฑฐ๋‚˜ yeild( )๋ฅผ ๋งŒ๋‚˜๋ฉด ๋‹ค์‹œ ์‹คํ–‰๋Œ€๊ธฐ์ƒํƒœ๊ฐ€ ๋˜๊ณ ,

     ๋‹ค์Œ ์ฐจ๋ก€์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

4. ์‹คํ–‰์ค‘์— suspend( ), sleep( ), wait( ), join( ), I/O block์— ์˜ํ•ด ์ผ์‹œ์ •์ง€ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

     I/O block์€ ์ž…์ถœ๋ ฅ์ž‘์—…์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

    ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋กœ ๋“ค์ˆ˜ ์žˆ๋‹ค. → ์ผ์‹œ์ •์ง€ ์ƒํƒœ์— ์žˆ๋‹ค๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์„ ๋งˆ์น˜๋ฉด ๋‹ค์‹œ ์‹คํ–‰๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

5. ์ง€์ •๋œ ์ผ์‹œ์ •์ง€์‹œ๊ฐ„์ด ๋‹ค๋˜๊ฑฐ๋‚˜(time-out), notify( ), resume( ), interrupt( )๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด,

     ์ผ์‹œ์ •์ง€ ์ƒํƒœ๋ฅผ ๋ฒ—์–ด๋‚˜ ๋‹ค์‹œ ์‹คํ–‰๋Œ€๊ธฐ์—ด์— ์ €์žฅ๋˜์–ด ์ž์‹ ์˜ ์ฐจ๋ก€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.

6. ์‹คํ–‰์„ ๋ชจ๋‘ ๋งˆ์น˜๊ฑฐ๋‚˜ stop( )์ด ํ˜ธ์ถœ๋˜๋ฉด ์“ฐ๋ ˆ๋“œ๋Š” ์†Œ๋ฉธ๋œ๋‹ค.

 

 

 

์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„

์“ฐ๋ ˆ๋“œ๋Š” ์šฐ์„ ์ˆœ์œ„ priority๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด ์šฐ์„ ์ˆœ์œ„์˜ ๊ฐ’์— ๋”ฐ๋ผ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์–ป๋Š” ์‹คํ–‰์‹œ๊ฐ„์ด ๋‹ฌ๋ผ์ง„๋‹ค.

์“ฐ๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•˜์—ฌ,

ํŠน์ • ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋” ๋งŽ์€ ์ž‘์—…์‹œ๊ฐ„์„ ๊ฐ–๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์“ฐ๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •ํ•˜๊ธฐ

  • ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์šฐ์„ ์ˆœ์œ„์˜ ๋ฒ”์œ„๋Š” 1~10์ด๋‹ค.
  • ์ˆซ์ž๊ฐ€ ๋†’์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.
  • ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ์“ฐ๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š”๋‹ค.
  • main๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ 5์ด๋ฏ€๋กœ main()  ๋‚ด์—์„œ ์ƒ์„ฑํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ์ž๋™์ ์œผ๋กœ 5๊ฐ€ ๋œ๋‹ค.
public class MyThread implements Runnable {
    void setPriority(int newPriority)		// ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ
    int getPriority()						// ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฐ˜ํ™˜

    public static final int MAX_PRIORITY = 10    // ์ตœ๋Œ€ ์šฐ์„ ์ˆœ์œ„
    public static final int MIN_PRIORITY = 1    // ์ตœ์†Œ ์šฐ์„ ์ˆœ์œ„
    public static final int NORM_PRIORITY = 5   // ๋ณดํ†ต ์šฐ์„ ์ˆœ์œ„
}

 

 

 

Main ์“ฐ๋ ˆ๋“œ

main( )์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ

ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์“ฐ๋ ˆ๋“œ๊ฐ€ main ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰๋˜๋„๋ก ํ•œ๋‹ค.

main ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰์„ ๋งˆ์น˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€๋งŒ

main ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰์„ ๋งˆ์ณค๋‹ค ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„์ง ์ž‘์—…์„ ๋งˆ์น˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š”๋‹ค.

์‹คํ–‰ ์ค‘์ธ ์‚ฌ์šฉ์ž ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.

 

 

 

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

  • ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์„ ๋•๋Š” ๋ณด์กฐ์ ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์ด๋‹ค.
  • ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ๋Š” ๊ฐ•์ œ์ ์œผ๋กœ ์ž๋™ ์ข…๋ฃŒ๋œ๋‹ค.
  • ์ผ๋ฐ˜ ์“ฐ๋ ˆ๋“œ์˜ ๋ณด์กฐ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ์˜ ์กด์žฌ๊ฐ€ ์˜๋ฏธ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์˜ˆ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ, ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ์˜ ์ž๋™์ €์žฅ, ํ™”๋ฉด ์ž๋™ ๊ฐฑ์‹  ๋“ฑ์ด ์žˆ๋‹ค.
  • ๋ฌดํ•œ ๋ฃจํ”„์™€ ์กฐ๊ฑด๋ฌธ์„ ์ด์šฉํ•ด์„œ ์‹คํ–‰ ํ›„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค์‹œ ๋Œ€๊ธฐํ•˜๋„๋ก ์ž‘์„ฑํ•œ๋‹ค.
public void run() {
	while(true) {
    	try {
        	Thread.sleep(3 * 100)
        } catch(InterruptedException e) {}
    	
        if(autoSave) autoSave();
    }
}

 

boolean isDaemon()

์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

void setDeamon(boolean on)

์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ ๋˜๋Š” ์‚ฌ์šฉ์ž ์“ฐ๋ ˆ๋“œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ on์˜ ๊ฐ’์„ true๋กœ ์ง€์ •ํ•˜๋ฉด ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋œ๋‹ค.

start()๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด IllegalThreadStateException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

๋™๊ธฐํ™” synchronization

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค์˜ ๊ฒฝ์šฐ,

์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์ž์›์„ ๊ณต์œ ํ•ด์„œ ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ์˜ ์ž‘์—…์— ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ๋œ๋‹ค.

์›๋ž˜ ์˜๋„ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ผ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํŠน์ • ์ž‘์—…์„ ๋๋งˆ์น˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

 

๋™๊ธฐํ™”๋ž€,

๊ณต์œ ๋œ ์ž์› ์ค‘์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ž์›์„ ๋ณดํ˜ธํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.

๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ์„ ์ž„๊ณ„ ์˜์—ญ์œผ๋กœ ์ง€์ •ํ•ด๋†“๊ณ ,

๊ณต์œ  ๋ฐ์ดํ„ฐ(๊ฐ์ฒด)๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” lock๋ฅผ ํš๋“ํ•œ ๋‹จ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์ด ์˜์—ญ ๋‚ด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„ ์˜์—ญ ๋‚ด์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฒ—์–ด๋‚˜์„œ lock๋ฅผ ๋ฐ˜๋‚ฉํ•ด์•ผ๋งŒ

๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฐ˜๋‚ฉ๋œ lock๋ฅผ ํš๋“ํ•˜์—ฌ ์ž„๊ณ„ ์˜์—ญ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

1. ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ ์ž„๊ณ„ ์˜์—ญ์œผ๋กœ ์ง€์ •

  • ๋ฉ”์„œ๋“œ ์•ž์— synchronized๋ฅผ ๋ถ™์ธ๋‹ค.
  • ๋ฉ”์†Œ๋“œ ์ „์ฒด๊ฐ€ ์ž„๊ณ„ ์˜์—ญ์œผ๋กœ ์„ค์ •๋œ๋‹ค.
  • ์“ฐ๋ ˆ๋“œ๋Š” synchronized ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ์‹œ์ ๋ถ€ํ„ฐ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฐ์ฒด์˜ lock์„ ์–ป์–ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ 
  • ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด lock๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
public synchronized void calcSum {
	// ์ž„๊ณ„ ์˜์—ญ
}

 

2. ํŠน์ •ํ•œ ์˜์—ญ์„ ์ž„๊ณ„ ์˜์—ญ์œผ๋กœ ์ง€์ •

  • ๋ฉ”์„œ๋“œ ๋‚ด์˜ ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ๋ธ”๋Ÿญ { } ์œผ๋กœ ๊ฐ์‹ธ๊ณ  ๋ธ”๋Ÿญ ์•ž์— synchronized๋ฅผ ๋ถ™์ธ๋‹ค.
  • ์ด๋•Œ ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” lock์„ ๊ฑธ๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.
  • ์ด ๋ธ”๋Ÿญ์„ synchronized ๋ธ”๋Ÿญ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ,
  • ์ด ๋ธ”๋Ÿญ ์˜์—ญ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด์„œ๋ถ€ํ„ฐ ์“ฐ๋ ˆ๋“œ๋Š” ์ง€์ •๋œ ๊ฐ์ฒด์˜ lock์„ ์–ป๊ฒŒ๋˜๊ณ , ์ด ๋ธ”๋Ÿญ์„ ๋ฒ—์–ด๋‚˜๋ฉด lock๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
synchronized(๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ณ€์ˆ˜){
	// ์ž„๊ณ„ ์˜์—ญ
}

 

 

Lock

  • ๋ชจ๋“  ๊ฐ์ฒด๋Š” lock์„ ํ•˜๋‚˜์”ฉ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • ํ•ด๋‹น ๊ฐ์ฒด์˜ lock์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋งŒ ์ž„๊ณ„ ์˜์—ญ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋“ค์€ lock์„ ์–ป์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.
  • ์ž„๊ณ„ ์˜์—ญ์€ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ขŒ์šฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
  • ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฉ”์„œ๋“œ ์ „์ฒด์— ๋ฝ์„ ๊ฑฐ๋Š” ๊ฒƒ๋ณด๋‹ค synchronized ๋ธ”๋Ÿญ์œผ๋กœ ์ž„๊ณ„ ์˜์—ญ์„ ์ตœ์†Œํ™”ํ•ด์„œ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ๋˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

 

 

 

๋ฐ๋“œ๋ฝ DeadLock

  • ๊ต์ฐฉ ์ƒํƒœ
  • ํ•œ ์ž์›์„ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒ
  • ๋‘˜ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ lock์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐ์ค‘์ธ๋ฐ lock์„ ์žก๊ณ ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋“ค๋„ ๋˜‘๊ฐ™์ด ๋‹ค๋ฅธ lock๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์„œ๋กœ block ์ƒํƒœ์— ๋†“์ธ ์ƒํƒœ
  • ์„œ๋กœ ์ƒ๋Œ€๋ฐฉ์˜ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฌดํ•œ ๋Œ€๊ธฐ ์ƒํƒœ

 

๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ์กฐ๊ฑด

๋„ค๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ์„ฑ๋ฆฝ๋  ๋•Œ ๋ฐœ์ƒ

 

1. ์ƒํ˜ธ ๋ฐฐ์žฌ Mutual exclusion

  • ์ž์›์€ ํ•œ ๋ฒˆ์— ํ•œ ํ”„๋กœ์„ธ์Šค๋งŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

2. ์ ์œ  ๋Œ€๊ธฐ (Hold and wait)

  • ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉด์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋˜์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ž์›์„ ์ถ”๊ฐ€๋กœ ์ ์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

3. ๋น„์„ ์  (No preemption)

  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋œ ์ž์›์€ ์‚ฌ์šฉ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ฐ•์ œ๋กœ ๋นผ์•—์„ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.

4. ์ˆœํ™˜ ๋Œ€๊ธฐ (Circular wait)

  • ํ”„๋กœ์„ธ์Šค์˜ ์ง‘ํ•ฉ {P0, P1, ,…Pn}์—์„œ P0๋Š” P1์ด ์ ์œ ํ•œ ์ž์›์„ ๋Œ€๊ธฐํ•˜๊ณ  P1์€ P2๊ฐ€ ์ ์œ ํ•œ ์ž์›์„ ๋Œ€๊ธฐํ•˜๊ณ  P2…Pn-1์€ Pn์ด ์ ์œ ํ•œ ์ž์›์„ ๋Œ€๊ธฐํ•˜๋ฉฐ Pn์€ P0๊ฐ€ ์ ์œ ํ•œ ์ž์›์„ ์š”๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

 

์ฐธ์กฐ

10์ฃผ์ฐจ ๊ณผ์ œ: ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋‚จ๊ถ์„ฑ, ์ž๋ฐ”์˜ ์ •์„ ๊ธฐ์ดˆํŽธ, ๋„์šฐ์ถœํŒ, 2019

์ฒœ์ธ๊ตญ, ์–ด์„œ์™€ JAVA๋Š” ์ฒ˜์Œ์ด์ง€!, INFINITYBOOKS, 2015

https://jwprogramming.tistory.com/12

'Programming > JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ์• ๋…ธํ…Œ์ด์…˜  (1) 2022.09.11
[Java] Enum  (1) 2022.09.08
[Java] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ  (0) 2022.09.01
[Java] ์ธํ„ฐํŽ˜์ด์Šค  (1) 2022.08.29
[Java] ํŒจํ‚ค์ง€  (0) 2022.08.17