Java

[ java ] Thread.sleep 사용법

JooKit 주킷 2021. 1. 5. 23:13
목차 접기
728x90
반응형
package com.sbs.practice.controller;

import org.springframework.stereotype.Controller;

@Controller
public class PracticeController
{
    public static void main(String[] args) 
    {
        System.out.println("sleep 실행전");

        try 
        {
            Thread.sleep(2000);
        }
        catch(InterruptedException e) 
        {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }

        System.out.println("sleep 실행 후");
    }
}
  • 위의 코드를 실행하면 "sleep 실행전"이 출력되고 2초 후에 "sleep 실행 후"가 출력된다.
보통 우리는 이런 컴파일러의 불평을 잠재우기 위해 
try-catch 문으로 감싸주고, 
catch 블록에서 잡힌 InterruptedException은 무시한다. 
매번 try-catch 문을 쓰기 싫어하는 개발자는 아래와 같이 
예외를 무시하는 헬퍼 메서드를 만들어 사용할 수도 있다. 
하지만 무작정 예외를 무시하는 것은 좋지 않은 방법이다. 
이 예외는 항상 적절히 처리되어야 한다.

Java Thread의 interrupt 메커니즘

  • InterruptedException은 자바 스레드의 인터럽트 메커니즘의 일부이다.
  • 자바에서는 스레드에 하던 일을 멈추라는 신호를 보내기 위해 인터럽트를 사용한다.
  • 어떤 스레드를 인터럽트 하고 싶으면 대상 스레드의 Thread.interrupt() 메서드를 호출하면 된다.
  • 그러면 대상 스레드에서는 아래 중 하나의 일이 일어나게 된다.
1. 현재 스레드가 대상 스레드를 수정할 수 있는 권한이 없으면 SecurityException이 발생한다.
2. 대상 스레드가 Object.wait(), Thread.sleep(), Thread.join(), Future.get(), BlockingQueue.take() 등의 메서드에 의해 블로킹된 경우, interrupt state가 사라지고 InterruptedException이 발생한다.
3. 대상 스레드가 InterruptibleChannel을 이용한 I/O 작업에 의해 블로킹된 경우, interrupt state가 설정되고 ClosedByInterruptException이 발생한다.
4. 대상 스레드가 Selector에서 블로킹된 경우, interrupt state가 설정되고 selection 작업에서 리턴된다.
5. 이외의 경우에는 interrupt state가 설정된다.

InterruptedException e

e.printStackTrace();
  • 에러 메세지의 발생 근원지를 찾아서 단계별로 에러를 출력한다.
  • printStackTrace를 사용자한테 보여주게 되면 서비스 이용중에 굉장한 불편을 겪게 된다.
    그러므로 모든 에러 메세지를 출력하는게 아닌 e.getMessage()를 출력해 보이는게 낫다.
728x90
반응형
LIST