2010-12-03 2 views
2

두 개의 스레드가 있습니다. 하나는 읽기 용이고 다른 하나는 보내는 것입니다. 쓰기가 실패하면 다른 스레드의 읽기 작업도 항상 실패합니까?Java 소켓의 쓰기가 동시 읽기 처리없이 실행될 수 있습니까?

적어도 하나의 사건이 (InterruptedIOException - 스레드가 중단되면) 발생하지 않을 것이라고 생각하지만 다른 것이 있습니까? 그렇다면 네트워크 문제와 관련된 사례가 있습니까?

답변

1

또 다른 방법은 소켓을 쓰기 위해 종료 한 경우입니다. 쓸 수는 없지만 읽을 수는 있습니다.

+0

제 경우에는 응용 프로그램의 버그 일 수 있습니다. 따라서 이것이 유일한 경우라면 무시해도됩니다. – penpen

+0

나는 그것이 유일한 다른 경우라고 말하지 않았다 ;-) – EJP

+0

답으로 선택하면 읽기가 실패하지 않고 쓰기 쓰는 경우를 제공한다. – penpen

0

소켓이 다른 쪽 끝에서 닫히면 글을 쓰는 데 실패 할 수 있습니다 (데이터는 이동할 곳이 없으므로). 아직 읽을 수있는 읽지 않은 데이터가있을 수 있습니다.

읽기에 시간 초과가 발생하면 소켓을 닫고 쓰기를 중지 할 수 있습니다. 예 : 다른 끝이 잠겨 있다면 이 작업을 수행하지 않으면 쓰기 쓰레드가 시간 초과 된 소켓 쓰기를 영원히 막을 수 있습니다. (그리고 영원히있을 수도 있습니다)

+0

다른 하나가 잠겨있어 아무 것도 읽지 않으므로 TCP 창이 항상 0입니다. 이것은 실제로 (많은 다른 시나리오와 달리) 재생산하기 쉽고, 독서 프로그램을 일시 중단합니다 (예 : * nix에있는 경우 Ctrl-Z를 눌러 프로그램을 중지하십시오. – nos

+0

사실 우리는 이미 읽기에 대한 타임 아웃을 처리하기 때문에이 부분은 괜찮습니다. – penpen

0

정말 상황에 따라 달라질 수 있습니다. 아마도 가장 일반적인 상황은 연결 종료이므로 읽기와 쓰기 모두 실패합니다. 그러나 반드시 그런 것은 아닙니다. 당신은 읽을 수 있지만 쓸 수없는 이상한 방화벽 설정이있을 수 있습니다.

내 조언은 가능한 모든 시나리오를 생각하는 대신 각 스레드를 개별적으로 프로그래밍하는 것입니다. 읽으 려하고 시도 할 수 없다면, 어떻게됩니까? 다른 스레드에서 쓰려고 시도 할 수 없다면 어떻게됩니까? 두 스레드가 읽고 쓸 수있는 것이 중요하다면 현재 스레드가 어떤 식 으로든 문제가있는 경우 (다른 스레드가 여전히 활성화되어있는 경우) 다른 스레드를 중지시키는 대체 메커니즘을 설계하십시오.

+0

실제로, 필자는 쓰기가 실패 할 때까지 기다리지 않고 읽는 쪽을 닫는 영장이없는 경우가 있는지 알고 싶다. – penpen

+0

@penpen, 오류 쓰기가 읽지 않은 데이터를 버리려는 경우에만. 나는 이것을 할 좋은 이유를 생각할 수 없다. –

+0

나는 정말로 명확하지 않았습니다. 나는 어떤면에서 흥미가 있었는지 (만약 있다면) 내가 읽기 실패로 끝나고, 읽기면은 여전히 ​​막혀 있습니다. 이 경우 닫고 다시 시작하여 일관된 상태로 유지하려고합니다. 쓰기에 대한 예외가 항상 읽음의 이벤트로 이어지게된다면 실제로 나는 물건들을 개별적으로 처리하도록해야합니다. – penpen

관련 문제