I/O 작업을 위해 block 된 thread 죽이기
- Posted at 2007/03/23 15:30
- Filed under Program/JAVA
다음 코드를 보자.
public class ThreadTest {
public static ReadThread readThread;
public static void main(String[] args) throws Exception {
readThread = new ReadThread();
readThread.start();
Thread testThread = new Thread() {
public void run() {
try {
sleep(2000);
readThread.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Test Thread End");
}
};
testThread.start();
System.out.println("Main End");
}
}
class ReadThread extends Thread {
boolean running = true;
public void run() {
try {
System.out.println("ReadThread Start");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while( (line = reader.readLine()) != null ) {
System.out.println(line);
if(!running) break;
}
System.out.println("ReadThread End");
} catch(Exception e) {
e.printStackTrace();
}
}
public void close() {
running = false;
System.out.println("Called ReadThread.close");
}
}
이 코드의 의도는 키보드를 통해 사용자의 입력을 받지만 10초가 지나면 자동 종료하도록 되어 있는 프로그램이다.
하지만 10초가 지나도 프로그램은 종료되지 않는다. 이유는 ReadThread의 run() 메소드 내에서 reader.readLine()의 경우 I/O를 위해 block 되었기 때문에 새로운 데이터가 오기 전까지 이 Thread는 run 상태로 돌아오지 않기 때문이다.
다음 화면을 보면 ReadThread가 종료되지 않는 것을 볼 수 있다.

Socket 등의 경우에는 Timeout 등을 설정할 수 있지만 일반적인 I/O에는 Timeout 옵션이 없다. 따라서 이런 경우에는 다음과 같이 ready(), available() 등과 같은 메소드를 이용하여 I/O 처리를 위해 block 되는 것을 제어해야 한다.
class ReadThread extends Thread {
boolean running = true;
public void run() {
try {
System.out.println("ReadThread Start");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while(running) {
if(reader.ready()) {
line = reader.readLine();
if(line == null) break;
System.out.println("Input:" + line);
} else {
sleep(10);
}
}
System.out.println("ReadThread End");
} catch(Exception e) {
e.printStackTrace();
}
}
public void close() {
running = false;
System.out.println("Called ReadThread.close");
}
}

Posted by 김형준
- Response
- No Trackback , 3 Comments
Trackback URL : http://www.jaso.co.kr/trackback/150
Comments List
-
음, 좋은 팁인데 루핑처리를 쓰레드에서 해야되는군요.
-
알고 계실지도 모르겠는데요.. 코드 하이라이트를 해주는 플러그인도 있긴하든데 태터에...그방법 말궁..
IDE 를 이클립스 쓰시는거 같은데, 전체 소스를 복사해다가요..워드에다가 붙여넣기한다음에 필요한 부분을 다시 복사해다가 에디터에 넣어보세요. 그럼 보기 좋게 하이라이팅이 됩니다.
http://bioblog.kobic.re.kr/combible/243 <- 샘플임다.-
감사합니다. 안그래도 그런거 찾고 있는 중이었는데...
-






