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
}//클래스
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(정적)메서드