ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] ์ž๋ฐ” ์“ฐ๋ ˆ๋“œ ์ƒํƒœ, ์šฐ์„ ์ˆœ์œ„(State, Priority)
    Android/Java 2021. 2. 5. 02:19
    ๋ฐ˜์‘ํ˜•
    • ์ด ๊ธ€์€ "์ž๋ฐ” ์˜จ๋ผ์ธ ์Šคํ„ฐ๋””" ์— ์ฐธ์—ฌํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

    ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ

    • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ํ•˜๋‚˜์˜ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์šด์˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•์€ ๋™์‹œ์„ฑ๊ณผ ๋ณ‘๋ ฌ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ฝ”์–ด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ๋™์‹œ์„ฑ์œผ๋กœ ๋น ๋ฅธ ์†๋„๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉด์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๋ณ‘๋ ฌ์„ฑ์€ ๋‹ค์ˆ˜์˜ ์ฝ”์–ด์—์„œ ๊ฐ ์ฝ”์–ด์— ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.



    ์ž๋ฐ” ์“ฐ๋ ˆ๋“œ ์ƒํƒœ (Thread State)

    ์ž๋ฐ” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด ๋™๊ธฐํ™”/๋น„๋™๊ธฐํ™” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์“ฐ๋ ˆ๋“œ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ๊ฒฝ์šฐ๋„ ์ƒ๊น๋‹ˆ๋‹ค.
    ์“ฐ๋ ˆ๋“œ ์ œ์–ดํ•˜๊ธฐ ์ „์— ์“ฐ๋ ˆ๋“œ์˜ ์ƒํƒœ๋กœ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ getState() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    • ๊ฐ์ฒด ์ƒ์„ฑ (NEW) : start() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ.

    • ์‹คํ–‰ ๋Œ€๊ธฐ (RUNNABLE) : ์‹คํ–‰์„ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ, ์–ธ์ œ๋“  ์‹คํ–‰ ์ƒํƒœ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์Œ.

    • ์ผ์‹œ ์ •์ง€ (WAITING) : ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ†ต์ง€ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ

    • ์ผ์‹œ ์ •์ง€ (TIMED_WAITING) : ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ

    • ์ผ์‹œ ์ •์ง€ (BLOCKED) : ๋™๊ธฐํ™”๋กœ ์ธํ•ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฝ์ด ํ’€๋ฆด ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ

    • Deprecated ๋œ ๋ฉ”์†Œ๋“œ๋Š” ์ œ์™ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • ์ฐธ๊ณ (https://widevery.tistory.com/28)

     

    ์‹ค์Šต ์ฝ”๋“œ

    public class MyThread extends Thread{
        @Override
        public void run() {
            for(int i=0;i<10000000;i++){
            }
    
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            for(int i=0;i<10000000;i++){
            }
        }
    }

    ์‹ค์Šต์œผ๋กœ ๋Œ๋ ค๋ณธ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. run ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— sleppํ•จ์ˆ˜๋กœ ์ธํ•ด TIMED_WAITING ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

    public class StateTrackThread extends Thread{
    
        Thread thread;
    
        public StateTrackThread(Thread thread) {
            this.thread = thread;
        }
    
        @Override
        public void run() {
            while (true){
                System.out.println("My ์“ฐ๋ ˆ๋“œ ์ƒํƒœ : "+thread.getState());
    
                if(thread.getState()  == Thread.State.NEW){
                    thread.start();
                }
    
                if(thread.getState() == State.TERMINATED){
                    break;
                }
    
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    ์“ฐ๋ ˆ๋“œ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ถ”์ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    public class Main {
        public static void main(String[] args) {
            StateTrackThread thread = new StateTrackThread(new MyThread());
    
            if(thread.getState() == Thread.State.NEW){
                System.out.println("StateTrack ์“ฐ๋ ˆ๋“œ ์ƒํƒœ : "+thread.getState());
                thread.start();
            }
    
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("StateTrack ์“ฐ๋ ˆ๋“œ ์ƒํƒœ : "+thread.getState());
        }
    }



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

    ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์„ ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง ๋ฐฉ๋ฒ•์—๋Š” ์šฐ์„ ์ˆœ์œ„(Priority) ์Šค์ผ€์ค„๋ง๊ณผ ๋ผ์šด๋“œ ๋กœ๋นˆ(Round-Robin) ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์šฐ์„ ์ˆœ์œ„ ์Šค์ผ€์ค„๋ง : ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๋” ๋งŽ์ด ์ฐจ์ง€ํ•˜๋Š” ์Šค์ผ€์ค„๋ง ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ setPriority() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ผ์šด๋“œ ๋กœ๋นˆ : Time Slice๋ฅผ ์ •ํ•ด์„œ ๊ทธ ์‹œ๊ฐ„๋งŒํผ๋งŒ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ณ  ์ดํ›„์—๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์Šค์ผ€์ค„๋ง ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. JVM์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž„์˜๋กœ ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.

    ์šฐ์„ ์ˆœ์œ„ ์Šค์ผ€์ค„๋ง ์‹ค์Šต ์ฝ”๋“œ

    ์“ฐ๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋Š” 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ์กด์žฌํ•˜๋ฉฐ 1์ด ๊ฐ€์žฅ ๋‚ฎ์€ ์“ฐ๋ ˆ๋“œ(MIN_PRIORITY), 10์ด ๊ฐ€์žฅ ๋†’์€ ์“ฐ๋ ˆ๋“œ(MAX_PRIORITY) ์ž…๋‹ˆ๋‹ค.

    public class MyThread extends Thread{
    
        int num;
    
        public MyThread(int num) {
            this.num = num;
        }
    
        @Override
        public void run() {
            System.out.println(this.num+" thread  start");
    
            for(int i=0;i<10000;i++){
                for(int j=0;j<10000;j++){
                    for(int k=0;k<10000;k++){
    
                    }
                }
            }
            System.out.println(this.num+" thread  end");
        }
    }

    Thread๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ์ฃผ์–ด์„œ ์“ฐ๋ ˆ๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œ์ผœ ์šฐ์„ ์ˆœ์œ„๋กœ ์ธํ•ด ์Šค์ผ€์ค„๋ง ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    public class Main {
        public static void main(String[] args) {
    
            for(int i=1;i<=5;i++){
                MyThread thread = new MyThread(i);
                if(i == 5){
                    thread.setPriority(Thread.MAX_PRIORITY);
                }else{
                    thread.setPriority(Thread.MIN_PRIORITY);
                }
                thread.start();
            }
        }
    }

    5๋ฒˆ ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ MAX_PRIORITY๋ฅผ ๋‘๊ณ  ๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” MIN_PRIORITY๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๋” ๋งŽ์ด ๊ฐ€์ ธ ์ œ์ผ ๋จผ์ € ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



    Main ์“ฐ๋ ˆ๋“œ

    ๋ชจ๋“  ์ž๋ฐ” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ Main ์“ฐ๋ ˆ๋“œ๊ฐ€ main() ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ผ๋ฉด ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋„ ์ข…๋ฃŒ๋˜์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.