자바 쓰레드 인터럽트(Thread Interrupt),스레드 종료하기 이론실습 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)
ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=768
ojc.asia

1. Interrupt
인터럽트는 스레드가 수행중인 작업을 중지하고 다른 작업을 수행해야 한다는 뜻입니다.
스레드를 즉시 종료시키기 위해서 stop() 메소드가 있었지만 deprecated 되었습니다. 그 이유는 스레드를 갑자기 종료하면, 스레드가 사용중인 자원들이 해제되지 않은 불안전한 상태로 남겨지기 때문입니다.
Thread의 interrupt() 메소드가 호출되면 스레드에 인터럽트가 예약 되는데 “스레드를 중단” 시키겠다는 뜻으로 아무 때나 중단되지 않으므로 일단 예약을 하는 것입니다. interrupt()가 예약된 메소드는 계속 실행되다가 sleep()이나 wait(), join() 같은 메소드들을 만나면 즉시 InterruptedException을 발생 시키고 이를 통해 run() 메소드를 정상 종료시킬 수 있습니다.
interrupt() : 호출 받은 쓰레드가 Non-Runnable 상태에 있지 않으면 InterruptedException 예외가 예약
Non-Runnable 상태(sleep(), wait(), join()등 WAIT, TIMED_WAIT상태)에 있거나 InterruptedException을 선언한 메소드를 호출하였으면 InterruptedException이 발생합니다.
호출 받은 쓰레드가 입출력 함수를 호출(BLOCKED 상태)하여 Non-Runnable 상태에 있으면 InterruptedException이 발생합니다.
Boolean isInterrupted() : 인터럽트가 예약되어 있는지 확인
boolean Thread.interrupted() : isInterrupted() 처럼 인터럽트가 예약 되어 있는지 알아보는 메소드이며 이 메소드가 호출되면 예약되어 있는 인터럽트가 취소 된다.
2. 쓰레드 라이프 사이클

3. 실습
class InterruptTest extends Thread {
public void run() {
for( int i = 0; i < 3; i++ )
System.out.println( i+1 + ". before sleep..." );
try {
sleep(1000);
} catch( InterruptedException e ) {
System.out.println( "InterruptedException 발생" );
}
}
public static void main(String[] args) throws InterruptedException {
InterruptTest t = new InterruptTest();
t.start();
t.interrupt();
//t 스레드가 종료할 때 까지 main Thread가 기다림
// join이 생략되면 "Main Thread 종료"가 제일 먼저 출력됨
t.join();
System.out.println("Main Thread 종료...");
}
}
[실행결과]
1. before sleep...
2. before sleep...
3. before sleep...
InterruptedException 발생
Main Thread 종료...
#자바스레드, #자바쓰레드, #자바Thread, #자바쓰레드인터럽트, #스레드, #Thread.interrupt, #자바, #JAVA, #자바동영상, #자바강의, #자바교육, #자바강좌, #자바동영상강의, #추천자바강의, #추천자바강좌, #JAVA동영상, #JAVA강의, #JAVA강좌, #JAVA교육, #JAVA, #추천JAVA강의, #추천JAVA교육, #추천JAVA강좌, #자바소스, #자바온라인교육, #자바온라인강의
댓글 없음:
댓글 쓰기