본문 바로가기
Language/JAVA

Thread.sleep() 과 interrupted()

by YoonJong 2023. 2. 12.
728x90

쓰레드를 일정시간동안 멈추게(잠들게) 할 수 있는 sleep() 메서드에 대해 알아보겠습니다.

 

static void sleep (long millis)

static void sleep (long millis , int nanos) 

 

먼저 static 메서드라는 것을 잘 인지하고 있어야 합니다.

sleep 은 자기 자신만을 멈추게 할 수 있습니다.

 

또한, 예외처리(InterruptedException) 을 필수처리 해야합니다.

Exception 타입으로 컴파일 - 예외처리 처리 필수

어떠한 문제가 생겨서 예외를 던지는 것이 아닌, 멈춘 도중에 time up 이나 interrupted로 깨우면 해당 예외와 try - catch 문을 이용해서 잠자는 상태를 벗어나는 것입니다.

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {}


// 메서드로 빼서 따로 처리하는 방법
void delay(long millis) {
try {
	Thread.sleep(millis);
} catch (InterruptedException e) {}

 

추가적으로, main 쓰레드뿐만 아니라, t1 , t2 쓰레드가 많을 경우 sleep() 메서드를 사용할 때 주의점입니다.

현재 총 3개 (main , t1 , t2) 쓰레드가 있다고 했을 때, 아래의 코드처럼 작성하면 t1 쓰레드가 아닌 main 쓰레드가 1초동안 멈추게 됩니다.

 

이유는 가장 위에서 말한 것처럼 static 메서드이기 때문에 자기 자신만 설정할 수 있기 때문입니다.

따라서, 기능은 같으나 헷갈리지 않도록 Thread 로 명시해주는 것이 좋습니다.

// 헷갈릴 여지가 있다. 
try {
    t1.sleep(1000);
} catch (InterruptedException e) {}

// Thread 를 사용해서 헷갈리지 않도록 한다.
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {}

interrupt() 와 Interrupted() 는 쓰레드의 작업을 취소합니다.

 

해당 메서드의 종류는 아래와 같습니다.

1. void interrupt() : 쓰레드의 interrupted 상태를 false -> true 로 변경

2. boolean isInterrupted() : 쓰레드의 interrupted상태를 반환

3. static boolean interrupted() : 현재 쓰레드의 interrupted 상태를 반환하고 false 로 변경

public class ThreadInterrupted {
    public static void main(String[] args) {
        Runnable t = new InterruptedTest();
        Thread th1 = new Thread(t);
        th1.start();

        System.out.println("th1.isInterrupted() = " + th1.isInterrupted());
        String input = JOptionPane.showInputDialog("아무 값이나 입력하세요");
        System.out.println("입력한 값은 " + input + "입니다");
        th1.interrupt(); // interrupt() 를 호출하면, interrupted = true 가 된다.
        System.out.println("th1.isInterrupted() = " + th1.isInterrupted());
        // main 쓰레드가 interrupt 되었는지 확인
        System.out.println("main thread.interrupted()= "+ Thread.interrupted());

    }
}

class InterruptedTest implements Runnable {

    @Override
    public void run() {
        int i = 10;

        while ( i != 0 && !interrupted()) {
            System.out.println(i--);
            for (int j = 0; j < 2000000000L; j++);  // 시간지연
        }

        System.out.println("카운트가 종료되었습니다.");
    }
}

// 결과값
10
th1.isInterrupted() = false
9
8
7
6
입력한 값은 5입니다
th1.isInterrupted() = true
main thread.interrupted()= false
카운트가 종료되었습니다.

해당 코드의 결과값을 보면 th1 쓰레드의 카운트가 끝나기전의 interrupted 상태는 false 입니다.

th1 쓰레드가 끝나기전에 값을 입력해서 해당 쓰레드는 멈추게 됩니다. 따라서 값을 입력한 후의 상태는 true 로 변환됩니다.

main 쓰레드는 아무런 요청을 받지 않았으므로 false 인상태입니다.

728x90

'Language > JAVA' 카테고리의 다른 글

람다식과 함수형 인터페이스  (0) 2023.02.13
쓰레드 동기화(Synchronization)  (0) 2023.02.13
쓰레드(Thread) 는 무엇일까?  (0) 2023.02.12
열거형(Enum) 을 알아보자  (0) 2023.02.12
Generics (지네릭스) 를 알아보자  (0) 2023.02.12

댓글