프로그래밍 정리/자바

쓰레드 죽이기

주누다 2013. 6. 17. 14:23
반응형

- 쓰레드를 살아서 움직이게 하기 위해서 보통 run() 메서드 내에서 while문을 사용.

조건이 만족하는 한 지속되고 반복된다는 특징 때문에 run() 메서드에서 while문이 자주 등장.

쓰레드의 종료는 run() 메서드의 종료를 의미하기 때문에 일반적으로 while문의 종료가 곧 쓰레드의 종료가 되는 경우가 많음.


- 쓰레드의 종료

-> run() 메서드의 종료는 쓰레드의 종료를 의미

-> 일반적으로 지속적인 작업을 하기 위해 run() 내에 while문을 포함하고 있으며, 이 while문이 끝나면 쓰레드가 종료되는 경우가 많음.


- Deprecated된 Thread의 stop() 메서드

-> public final void stop() Deprecated

-> public final void stop(Throwable obj) Deprecated


- Deprecated된 메서드

-> Deprecated된 메서드는 안전하지 못하며 권장하지 않는 구버전의 메서드라는 의미

-> Java Doc API를 보면 Deprecated된 메서드는 굵은 글씨체로 정확하게 표시


- Deprecated 되었다는 말은 이 메서드를 사용하는 것은 안전하지 못하며 권장하지 않는 구버전의 메서드라는 용어.

즉, stop()을 사용하지 말라는 뜻. 그렇다면 쓰레드를 안전하게 종료할 방법이 있어야 함. 보통의 경우 어떠한 방식으로든

run()을 종료함으로써 쓰레드를 멈추게 하면 됨. 일반적으로 다음과 같이 while문의 조건을 제어함으로써 run()을 빠져나오게 하는 방법을 주로 사용.


- run() 메서드의 일반적인 모델(while문의 조건에 따라 run()의 종료를 제어)

-> public void run(){

while(조건){

// 작업

}

}


============================================================================================================



public class TerminateThread extends Thread{

// 쓰레드의 종료를 제어하는 플래그

private boolean flag = false;

@Override

public void run() {

// TODO Auto-generated method stub

int count = 0;

System.out.println(this.getName() + "시작");

while(!flag){

try{

// 작업

this.sleep(100);

}catch (Exception e) {

// TODO: handle exception

}

}

System.out.println(this.getName() + "종료");

}

public void setFlag(boolean flag){

this.flag = flag;

}

}


import java.io.IOException;


public class TerminateThreadMain {

public static void main(String[] args) throws IOException {
System.out.println("작업시작");
TerminateThread a = new TerminateThread();
TerminateThread b = new TerminateThread();
TerminateThread c = new TerminateThread();
a.start();
b.start();
c.start();
int i;
System.out.println("종료할 쓰레드를 입력하시오! A, B, C, M?\n");
while(true){
i = System.in.read();
if(i == 'A'){
a.setFlag(true);
}else if(i == 'B'){
b.setFlag(true);
}else if(i == 'C'){
c.setFlag(true);
}else if(i == 'M'){
a.setFlag(true);
b.setFlag(true);
c.setFlag(true);
System.out.println("main 종료");
break;
}
}
}
}

============================================================================================================


- 쓰레드 제어를 위한 flag 설정하기

-> private boolean flag = false;

-> // flag가 true로 설정되면 while문이 끝남.

-> public void setFlag(boolean flag){

this.flag = flag;

}


- static은 모든 객체에서 단 하나의 메모리만 생성되는 특징.


반응형

'프로그래밍 정리 > 자바' 카테고리의 다른 글

공유자원의 접근  (0) 2013.06.17
멀티쓰레드와 문제점  (0) 2013.06.17
NotRunnable 상태 만들기  (0) 2013.06.17
쓰레드의 우선권  (0) 2013.06.17
쓰레드의 상태  (0) 2013.06.17