I/O 작업을 위해 block 된 thread 죽이기

자바에서 Thread내에서 I/O 작업이 있는 경우 해당 Thread를 강제로 죽이는 방법은 거의 없다.
다음 코드를 보자.

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");

       }

}


 

사용자 삽입 이미지
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/150

Comments List

  1. typos 2007/03/23 18:09 # M/D Reply Permalink

    음, 좋은 팁인데 루핑처리를 쓰레드에서 해야되는군요.

  2. 컴바이블 2007/03/28 22:21 # M/D Reply Permalink

    알고 계실지도 모르겠는데요.. 코드 하이라이트를 해주는 플러그인도 있긴하든데 태터에...그방법 말궁..
    IDE 를 이클립스 쓰시는거 같은데, 전체 소스를 복사해다가요..워드에다가 붙여넣기한다음에 필요한 부분을 다시 복사해다가 에디터에 넣어보세요. 그럼 보기 좋게 하이라이팅이 됩니다.
    http://bioblog.kobic.re.kr/combible/243 <- 샘플임다.

    1. 김형준 2007/03/29 16:32 # M/D Permalink

      감사합니다. 안그래도 그런거 찾고 있는 중이었는데...

Leave a comment
« Previous : 1 : ... 270 : 271 : 272 : 273 : 274 : 275 : 276 : 277 : 278 : ... 388 : Next »