문제

우리는 오히려 큰 복잡한 응용 프로그램에서 작성 자바에 실행되는 최고의 Gridgain 패키지입니다.문제를 내는 데는 이 응용 프로그램은 거기 앉아서 요청을 처리하기 위해 하루에 약하기 전에 모든 요청 시작 결과는 형식의 예외가 java.nio.습니다.ClosedByInterruptException.

내 가정이 응용 프로그램이 없는 것을 해제 파일을 처리하고 하루를 보낸 후에의 지속적인 사용이 그것을 밖으로 실행하고 더 이상 계속 요청을 처리하(각 요청에 필요한 독서의 여러 파일에서 각각의 그리드 노드).우리가 싸서 대부분의 우리의 파일 IO operations 클래스에서 같은이

package com.vlc.edge;

import com.vlc.common.VlcRuntimeException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public final class BufferedReaderImpl implements BufferedReader {
    private java.io.BufferedReader reader;

    public BufferedReaderImpl(final String source) {
        this(new File(source));
    }

    public BufferedReaderImpl(final File source) {
        try {
            reader = new java.io.BufferedReader(new FileReader(source));
        } catch (FileNotFoundException e) {
            throw new VlcRuntimeException(e);
        }
    }

    public BufferedReaderImpl(final Reader reader) {
        this.reader = new java.io.BufferedReader(reader);
    }

    public String readLine() {
        try {
            return reader.readLine();
        } catch (IOException e) {
            throw new VlcRuntimeException(e);
        }
    }

    public void close() {
        try {
            reader.close();
        } catch (IOException e) {
            throw new VlcRuntimeException(e);
        }
    }
}

나는 생각한 문제는 이 디자인되지 않을 명시적으로 해제 파일 핸들,나의 솔루션을 제안했다 추가하는 것입을 완료 방법은 다음과 같이

    protected void finalize() throws Throwable
    {
        reader.close();
        super.finalize();   
    }

는 이것을 할 것이 명시적으로 합니다.질문(마지막으로)여부는 이가 있을 가능성이 어떤 효과가 있습니다.지와 같은 클래스 java.io.BufferedReader 이미 몇 가지 메커니즘을 다루고 이러한 유형의 문제입니까?

편집:도 크게 감사하고 여기에는 것은 방법의 여부를 확인이 실제로 문제...ie 는 방법이 있을 쿼리를 실행 JVM 요청에 대한 그것의 파일을 처리 할당?

도움이 되었습니까?

해결책

거기에 작은 지점에서 재정의 finalize().는 경우에는 핸들이 쓰레기 수집하고 확정,다음 그래서 인스턴스 java.io.BufferedReader 고 있습니다.

가능(에 따라 사양)는 손잡이가 쓰레기 수집하지만 완료,하지만 이것은 매우 가능성이 높습니다.

할 수 있을 사용하여 시험 PhantomReferences 청소를 사용하지 않는 파일 핸들,그러나 내 생각하는 귀하의 인스턴스 BufferedReaderImpl 아직도 참 어딘가에서(예를들면에서 값 Map 파일 이름에서 열 손잡이)그리고 무엇이 그들을 방지하에서 폐쇄(이 경우 종료자는 도움이 되지 않습니다.)

다른 팁

종료자가 될 수 없습에 의존하는 부름을 받았습니다.그것은 좋은 방법에 대한 자원을 관리합니다.표준 구성에서 Java 를 이것은:

InputStream in = null;
try {
  in = ...;
  // do stuff
} catch (IOException e) {
  // error
} finally {
  if (in != null) { try { in.close(); } catch (Exception e) { } }
  in = null;
}

할 수 있습을 감싸는 이러한 손잡이 안쪽 반지만 강력한 접근 방식이다.

Java 사양을 말한다는 것을 보장하지 않'finalize()'실행됩니다.코드가 명시적으로 닫 FileReader 자신입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top