본문 바로가기
개발 수업/JAVA

[Java] 스레드/스레드 제어,데몬(daemon)스레드

by 오늘 하루s 2023. 5. 25.
728x90
더보기

Day20-2. 230525

스레드 제어

스레드 상태

- 실행 상태 :

실행 대기 상태에 있는 스레드 중에서 운영체제는 하나의 스레드를 선택하고 CPU(코어)가 run() 메소드를 실행하는 상태

 

- 종료 상태 : 

실행 상테에서 run() 메소드가 종료되면, 더 이상 실행할 코드가 없기 때문에 실행을 멈춘 상태.

 

- 스레드는 실행 대기 상태와 실행 상태로 번갈이아 변하면서, 경우에 따라 실행 상태에서 일시 정지 상태로 가기도 함.

일시 정지 상태는 스레드가 실행할 수 없는 상태.

일시 정지 상태에서는 바로 돌아갈 수 없고, 일시 정지 상태에서 빠져나와 실행 대기 상태로 가야함.

 

스레드 상태 제어

스레드 상태 제어란?

실행 중인 스레드의 상태를 변경하는 것.

 

주어진 시간 동안 일시 정지

Thread 클래스의 정적 메소드은 sleep()을 사용

Thread.sleep() 메소드를 호출한 스레드는 주어진 시간 동안 일시 정지 상태가 되고, 다시 대기 실행상태로 돌아감.

- 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

주 스레드가 종료되면 데몬 스레드가 강제적으로 자동 종료.

try {
     Thread.sleep(1000);
} catch (InterruptedException e) {
     //interrupt() 메소드가 호출되면 실행
}

 

스레드의 안전한 종료
  • interrupt() 메소드를 이용

interrupt() 메소드는 스레드가 일시 정지 상태에 있을 때 InterruptedException을 발생시키는 역할.

 

0.01초 후 출력 스레드를 중지>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package chap12;
 
public class Interrupt {
 
    public static void main(String[] args) {
        PrintThread1 thread = new PrintThread1();
        thread.start();
        
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt(); //스레드를 종료하기 위해
        //InterruptException발생
    }
}
cs
더보기

* 실행 결과

runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
runnning(실행중)
자원정리
실행종료

java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at chap12.PrintThread1.run(PrintThread1.java:10)

무한 반복해서 출력하는 스레드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package chap12;
 
public class PrintThread1 extends Thread {
 
    public void run() {
        try {
            while(true){
                System.out.println("runnning(실행중)");
                    Thread.sleep(1);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("자원정리");
        System.out.println("실행종료");
    }
}
cs

 

 

데몬(daemon) 스레드

- 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

주 스레드가 종료되면 데몬 스레드가 강제적으로 자동 종료.

ex) 워드프로세서의 자동 저장, 미디어플레이어의 동영성 및 음악재생- 스레드를 데몬으로 만들기 위해 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출.- setDaemon(true)를 호출하면 IllegalThreadStateException이 발생하므로 start() 메소드 호출 전에 setDaemon(true)를 호출해야함.

 

1초 주기로 sava() 메소드를 호출하는 데몬 스레드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chap12;
 
public class AutoSaveThread extends Thread {
 
    @Override
    public void run() {
        while(true) {
        try {
                Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
                save();
            }
    }
 
    public void save() {
        System.out.println("자동으로 저장");
    }    
}
cs

 

메인 스레드가 실행하는 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chap12;
 
public class DeamonMain {
 
    public static void main(String[] args) {
        System.out.println("메인스레드(워드작업) 시작");
        
        AutoSaveThread asthread = new AutoSaveThread();
        asthread.setDaemon(true);
        asthread.start();
        
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("워드작업끝");
        System.out.println("메인스레드 종료");
    }
}
cs
더보기

* 실행 결과

메인스레드(워드작업) 시작
자동으로 저장
자동으로 저장
워드작업끝
메인스레드 종료

 

728x90