소켓 IO 작업에서 스레드 차단을 즉시 종료하는 방법은 무엇입니까?
Java의 맥락에서 GUI 창을 열 때 네트워크 입력을 읽는 새 스레드를 만들고 창을 닫으면 소켓 리소스를 해제하고 스레드를 즉시 종료하고 싶습니다. 이제 setSoTimeout 메서드를 사용하고 있지만 시간 초과 예외를 기다리고 싶지 않습니다. 아무도 제안을 할 수 있습니까? 감사!
이를 수행하는 방법에는 (잠재적으로) 세 가지가 있습니다.
Socket.close()
소켓에서 호출 하면 연결된 개체InputStream
와OutputStream
개체 가 닫히고 Socket 또는 (연결된) 스트림 작업에서 차단 된 모든 스레드가 차단 해제됩니다. javadoc에 따르면 소켓 자체에 대한 작업은SocketException
.호출
Thread.interrupt()
은 (지정되지 않은 일부 상황에서) 차단 I / O 작업을 중단하여InterruptedIOException
.주의 사항에 유의하십시오. 분명히 "interrupt ()"접근 방식은 "대부분의"최신 Java 플랫폼에서 작동하지 않습니다. (다른 사람이 시간과 성향이 있다면이 접근 방식이 작동하는 상황을 조사 할 수 있습니다. 그러나 행동이 플랫폼에 따라 다르다는 사실만으로도 애플리케이션이 필요한 경우에만 사용해야한다는 사실만으로도 충분합니다. 특정 플랫폼에서 작업 할 수 있습니다. 어느 시점에서 스스로 쉽게 "시도"할 수 있습니다.)
이를 수행하는 세 번째 방법은
Socket.shutdownInput()
및 / 또는 을 호출하는 것Socket.shutdownOutput()
입니다. javadocs는 현재 차단 된 읽기 및 / 또는 쓰기 작업에서 어떤 일이 발생하는지 명시 적으로 말하지 않지만 차단을 해제하고 예외를 throw 할 것이라고 생각하는 것은 합리적이지 않습니다. 그러나 javadoc이 무슨 일이 발생하는지 말하지 않으면 동작은 플랫폼에 따라 다르다고 가정해야합니다.
나는이 질문이 오래되었다는 것을 알고 있지만 아무도 Thread.interrupt()
"현대 플랫폼" 의 "수수께끼"를 풀지 않은 것 같아서 몇 가지 조사를했습니다.
이것은 Windows7 (64 비트)의 Java 8에서 테스트되었지만 다른 플랫폼에서도 마찬가지입니다.
호출 Thread.interrupt()
않습니다 하지 가 발생하는 것은 InterruptedIOException
무엇 발생하면 때문이다 InputStream.read()
메소드가 리턴과 -1
및 Thread.interrupted()
-flag 설정됩니다.
따라서 다음은 '수정 된'read () 던지는 것으로 간주 될 수 있습니다 InterruptedIOException
.
static final int read(Socket socket, byte[] inData)
throws SocketTimeoutException, // if setSoTimeout() was set and read timed out
InterruptedIOException, // if thread interrupted
IOException // other erors
{
InputStream in = socket.getInputStream();
int readBytes = in.read( inData, 0, inData.length);
if ( Thread.interrupted() )
{
throw new InterruptedIOException( "Thread interrupted during socket read");
}
return readBytes;
}
'Nice programing' 카테고리의 다른 글
셀러리 작업 미리 가져 오기 이해 (0) | 2020.11.15 |
---|---|
Maven 다운로드에는 .lastUpdated가 확장자로 있습니다. (0) | 2020.11.15 |
git 태그 삭제 및 다시 추가 (0) | 2020.11.15 |
실존 적 유형의 이론적 근거는 무엇입니까? (0) | 2020.11.15 |
`import module`이`from module import function`보다 더 나은 코딩 스타일입니까? (0) | 2020.11.15 |