2011-02-27 4 views

답변

3

UDP 패킷을 읽으려면 DatagramChannel을 사용하고 읽기 스레드는 인터럽트하십시오. Thread.interrupt (및 DatagramChannel)의 문서에 따라, 읽기 작업은 ClosedByInterruptException을 발생시킵니다.

+0

DatagramChannel을 [blocking-mode]로 설정할 수 있습니다 (http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/spi/AbstractSelectableChannel.html#configureBlocking). % 28boolean % 29), DatagramSocket처럼 동작합니다. 비 차단 모드에서 DatagramChannel.receive()는 즉시 null을 반환 할 수 있습니다. 이전에 비 차단 IO를 사용한 적이 없다면 혼란 스러울 것입니다. DatagramChannel의 javadoc은 물론 동일하게 말할 것입니다. 그러나 때때로이 문제를 우연히 발견하게됩니다. – Boris

2

JB가 해결책의 한 부분을 게시했습니다. 하지만 NIO 채널을 사용하지 않는 경우 AFAIK 솔루션은 소켓을 고려하여 닫고 runnable/callable에서 마찬가지로 처리합니다. I did something similar 당신이 관심이있는 경우에 대비하여 TCP 소켓이있는 동안. 솔루션의 실현 가능성은 소켓을 닫을 수 있는지 여부에 따라 달라집니다. 이 경우 NIO 솔루션을 사용하는 것이 훨씬 의미가 있습니다.

0

읽기 시간 제한을 훨씬 짧게 설정하고 읽기 시간 초과가 발생했다고 간주하기 전에 읽기 메서드를 올바른 횟수 반복하십시오. 다른 (n-1) 건에서는 Thread.isInterrupted()를 확인합니다.

관련 문제