4-3.(3) Thread 종료

zhyun·2020년 9월 23일
0

HighJava

목록 보기
30/67

Thread 종료

  • Thread의 stop()메서드를 호출하면 쓰레드가 바로 멈춘다.
    => 이때 사용하던 자원을 정리하지 못하고 바로 프로그램이 종료
    => 나중에 실행되는 프로그램에 영향을 줄 수 있음.
    => 그래서 현재 stop()메서드비추천(deprecated)

  • 아래 예제 이후에 Thread 종료 메서드 정리부분 있음
    T13_ThreadStopTest

public class T13_ThreadStopTest {
	public static void main(String[] args) {
		ThreadStopEx1 th = new ThreadStopEx1();
		//th.start();
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) { //Interrupted :방해
			e.printStackTrace();
		}
		
		//1. stop() 메서드 이용한 쓰레드 멈추기 (안씀)
		//th.stop(); //@Deprecated -> 콘솔창 : 1초 뒤에 쓰레드 처리중...만  출력되고 끝남
		
		//2. setStop(true) 메서드 이용한 쓰레드 멈추기
		//th.setStop(true); //=> 상태값 true 줘서 끝냄 => 1초 뒤 콘솔창: 쓰레드 처리중... 자원정리중..실행종료.
		
		//3.interrupt()메서드를 이용한 쓰레드 멈추기
		ThreadStopEx2 th2 = new ThreadStopEx2();
		th2.start();
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		th2.interrupt();  
	}//main
}//class

stop(), setStop() 사용 위한 쓰래드 클래스

class ThreadStopEx1 extends Thread{
	private boolean stop; // true&false 값 저장을 위한 변수
	
	public void setStop(boolean stop) {
		this.stop = stop;
	}
	
	@Override
	public void run() {
		while(!stop) {//무한루프
			System.out.println("쓰레드 처리중...");
		}
		System.out.println("자원 정리 중...");
		System.out.println("실행종료.");
	}
	
}//class

interrupt()메서드를 사용 위한 쓰레드

class ThreadStopEx2 extends Thread{
	@Override
	public void run() {
		//방법1 => sleep()메서드나 join()메서드 등을 사용했을 때
	//		  interrupt()메서드를 호출하면 InterruptExeption이 발생한다.
//		try {
//			while(true) {
//				System.out.println("쓰레드 처리 중...");
//				Thread.sleep(1);
//			}
//		} catch (InterruptedException ex) {
//			//ex.printStackTrace();
//		}
		
		//방법2 => interrupt()메서드가 호출되었는지 검사하기
		while(true) {
			System.out.println("쓰레드 처리중...");
			
			//검사방법1 => interrupt()메서드가 호출되었는지 검사하기
			//this. -> ThreadStopEx2의 객체의 것 (인스턴스)
//			if(this.isInterrupted()) {//interrupt()메서드가 호출되면 true
//				System.out.println("인스턴스용 isInterrupted()");
//				break;
//			}
			
			//검사방법2=> 쓰레드의 정적 메서드를 이용하는 방법 (한번만 호출 할 수 있다)
			if(Thread.interrupted()) {//interrupt()메서드가 호출되면 true
				System.out.println("정적메서드 isInterrupted()");
				break;
			}
		}
		
		System.out.println("자원 정리 중...");
		System.out.println("실행 종료.");
	
	}//run
}//클래스

(1) stop메서드

  • @Deprecated
  • ThreadStopEx1의 객체 th
    => th.start(); -> th.stop;
    => 콘솔창 : 1초 뒤에 쓰던 자원을 정리하지 못하고 "쓰레드 처리중..."만 반복되다가 끝난다.

(2)setStop()메서드

  • ThreadStopEx1의 객체 th
    => th.setStop(true);
    => 상태값 true 줘서 끝낸다. 1초 뒤 콘솔창: 쓰레드 처리중..자원정리중..실행종료

(3) interrupt()메서드

  • ThreadStopEx2의 객체 th2
  • th2.start(); 한 다음에
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		th2.interrupt(); 
  • 위와 같이 Thread.sleep() try/catch 다음에 th2.interrupt() 실행

  • <방법 1.> sleep() join()등을 사용했을 때
    interrupt()메서드 호출하면 InterruptExeption 발생
    => 주의 사항
    : class ThreadStopEx2 extends Thread 에 있는 try/cath에서
    ex.printStackTrace(); 를 주석처리 해주고 실행해야 한다.
    : 주석 처리 안하면

    : 주석 처리 하면 쓰레드 처리중..자원정리중..실행종료

  • <방법 2.> interrupt()메서드가 호출되었는지 검사하기

------> 검사방법1

: interrupt()메서드가 호출되었는지 검사
: this. => ThreadStopEx2의 객체의 것 (인스턴스)
: if(this.isInterrupted()) => 인스턴스 메서드

-------> 검사방법2
: 쓰레드의 정적메서드를 이용하는 방법
: Thread.interrupted() => static(정적)메서드

profile
HI :)

0개의 댓글