2012-06-04 2 views
0

내가 http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html에서 아파치 공용 IOUtils.copy()의 구현을 찾고 그것이 결국 귀결 : 내가 Executor이를 실행하고IO에서 중단을 처리하는 우아한 방법은 무엇입니까?

public static long copyLarge(InputStream input, OutputStream output) 
     throws IOException { 
    // DEFAULT_BUFFER_SIZE is 4096 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    long count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 

, 작업 시간 초과 등이 있지만 나는 경우에도 제대로 이해한다면 이 시간이 초과되고 Future이 취소되면이 루프의 스레드 상태에 대한 검사가 없기 때문에 스레드가 계속 실행됩니다. 이로 인해 위험한 누출과 기아가 발생합니다.

루프를 다시 작성해야하는 것처럼 보이지만이를 처리 할 수있는 제정신이고 올바른 방법은 무엇입니까? throw new IOException(new InterruptedException())? 메서드를 던져서 InterruptedException으로 선언하고 던져주세요 (모든 IO 도우미 메서드에 대해이 메서드를 사용하지 마십시오)?

편집 : 그냥 구아바에서 ByteStreams을 확인하고이 같은 일을하고있는 것 같다. 이제는 왜 두 개의 주요 라이브러리가 이러한 루프에서 중단을 지원하지 않는지 궁금합니다. 내가 놓친 게 있니? 당신이 input 및/또는 output을 닫으면

+0

이 문제에 대한 진정한 해결책은 NIO를 사용하는 것 같습니다. 스레드 인터럽트에 적절히 반응하는 것으로 보입니다. –

답변

1

copyLarge 방법은 루프를 종료, 예외가 발생합니다.

+0

고마워요, 그게 무료로 휴식하는 하나의 방법입니다. –

1

차단 I/O (즉, java.io 패키지)의 경우 수동으로이를 확인하고 그에 대한 응답을해야합니다.

if (Thread.currentThread().isInterrupted()) { 
    // do something here to stop processing 
} 

채널 (java.nio)을 사용하는 경우이 작업을 수행 할 필요가 없습니다. NIO 연산 중 하나가 실행되는 동안 인터럽트 된 스레드는 해당 연산이 ClosedByInterruptException을 발생하도록합니다.

관련 문제