UDP 패킷을 차단하는 스레드가 있는데 수신 타임 아웃이 발생하기 전에 해당 패킷을 잊어 버리고 다른 작업을 수행해야한다고 알릴 수 있어야합니다. 이 일을 할 수있는 방법이 있습니까?DatagramSocket.receive() 호출로 인해 차단 된 스레드를 깨울 수 있습니까?
5
A
답변
3
UDP 패킷을 읽으려면 DatagramChannel을 사용하고 읽기 스레드는 인터럽트하십시오. Thread.interrupt (및 DatagramChannel)의 문서에 따라, 읽기 작업은 ClosedByInterruptException을 발생시킵니다.
2
JB가 해결책의 한 부분을 게시했습니다. 하지만 NIO 채널을 사용하지 않는 경우 AFAIK 솔루션은 소켓을 고려하여 닫고 runnable/callable에서 마찬가지로 처리합니다. I did something similar 당신이 관심이있는 경우에 대비하여 TCP 소켓이있는 동안. 솔루션의 실현 가능성은 소켓을 닫을 수 있는지 여부에 따라 달라집니다. 이 경우 NIO 솔루션을 사용하는 것이 훨씬 의미가 있습니다.
0
읽기 시간 제한을 훨씬 짧게 설정하고 읽기 시간 초과가 발생했다고 간주하기 전에 읽기 메서드를 올바른 횟수 반복하십시오. 다른 (n-1) 건에서는 Thread.isInterrupted()를 확인합니다.
관련 문제
- 1. C#에서 수면 스레드를 깨울 수 있습니까?
- 2. 수면 스레드를 깨울 방법이 있습니까?
- 3. iPhone을 깨울 수 있습니까?
- 4. 파이썬은 신호가있는 대기열에서 차단 된 스레드를 어떻게 죽일 수 있습니까?
- 5. C# 차단 된 스레드를 죽이는 방법?
- 6. glGetError가 스레드를 차단할 수 있습니까?
- 7. 가 완료되면 이미 차단 된 스레드를 깨우려고
- 8. 이 릴리스 호출로 인해 계측기가 충돌합니까?
- 9. 중첩 된 호출로 인해 C에서 초기화되지 않은 인수가 발생할 수 있습니까?
- 10. 스레드가 차단 된 경우. 동일한 프로세스 또는 전체 프로세스에서 다른 스레드를 차단할 수 있습니까?
- 11. 비 관리 코드로 차단 된 관리 스레드를 종료하는 방법은 무엇입니까?
- 12. 예기치 않은 SocketException이 발생하여 DatagramSocket.receive()가 실패했습니다.
- 13. 차단 된 부스트 :: 스레드
- 14. 차단 작업을 기다리는 스레드를 중단 하시겠습니까?
- 15. 어떻게 파이썬에서 차단 방법을 중단시킬 수 있습니까?
- 16. RPC 호출로 GWT EntityProxy를 사용할 수 있습니까?
- 17. 차단 된 SPMV 구현
- 18. BackgroundWorker의 스레드를 죽일 수 있습니까?
- 19. SimpleHTTPServer, 차단 및 차단 된 요청 처리기
- 20. 네이티브 라이브러리 호출로 인해 관리 코드의 메모리 누수 여부를 어떻게 알 수 있습니까?
- 21. 관리되지 않는 코드 호출로 인해 WCF 프로세스가 손상된다
- 22. wxDialog는 제대로 작동하지만 wxFileDialog 호출로 인해 프로그램이 종료되지 않습니다.
- 23. 비 차단 서버 및 차단 된 I/O 클라이언트가 통신 할 수 있습니까?
- 24. Symfony : Ajax 호출로 인해 다음 쿼리 대기열이 발생합니다.
- 25. 연속적인 Ajax 호출로 인해 세션 무효화가 작동하지 않습니다.
- 26. SAP에서 차단 된 트랜잭션
- 27. 비 차단 IO를 어떻게 버퍼링 할 수 있습니까?
- 28. non-blocking 호출로 잠들었습니다.
- 29. 어떻게하면 루아 스레드를 깨끗하게 끝낼 수 있습니까?
- 30. 다른 앱 도메인에서 스레드를 만들 수 있습니까?
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