我有一個阻塞UDP數據包的線程,並且我需要能夠告訴它忘記該數據包,並在發生接收超時之前執行其他操作。有沒有辦法做到這一點?我可以喚醒由於對DatagramSocket.receive()的調用而被阻塞的線程嗎?
5
A
回答
3
使用DatagramChannel讀取UDP數據包並中斷讀取線程。根據Thread.interrupt(和DatagramChannel)的文檔,讀取操作將拋出ClosedByInterruptException。
2
JB公佈瞭解決方案的一部分。但是如果你不使用NIO通道,這裏的解決方案AFAIK將關閉套接字,並在你的可運行/可調用中處理它。 I did something similar一會兒回來,用TCP套接字,如果你有興趣的話。解決方案的可行性還取決於在你的情況下關閉插座是否可以接受。在這種情況下,使用NIO解決方案會更有意義。
0
設置一個更短的讀取超時時間,讓您的read方法在它認爲發生讀取超時之前循環正確的次數。在其他(n-1)個案中檢查了Thread.isInterrupted()。
相關問題
- 1. 喚醒線程而不冒被阻塞的風險
- 2. 喚醒線程在accept()調用時被阻塞
- 3. Java喚醒阻塞線程定期
- 4. 阻塞的線程能夠喚醒自己嗎?
- 5. 我可以一次更新我的TableView項目而不阻塞UI線程嗎?
- 6. 由於線程被阻塞導致的性能問題
- 7. 我可以強制matplotlib在PyQt線程/進程中阻塞嗎?
- 8. 將完成添加以喚醒已被阻止的線程,取消
- 9. 當我的Android被拔出並睡眠時,我可以喚醒我的Android嗎?
- 10. UI線程被阻塞
- 11. Netty線程被阻塞
- 12. 由於無法關閉數據庫連接而導致線程被阻塞
- 13. UI線程阻塞調用COM對象的後臺線程
- 14. 我可以通過編程從睡眠中喚醒Mac嗎?
- 15. 可以阻塞的java線程的方法由另一個線程執行?
- 16. 阻塞線程的調用方法
- 17. OpenMP阻塞線程中的調用
- 18. ZMQ對(用於信令)由於連接不好而阻塞
- 19. 我可以防止MongoDB :: command()阻塞嗎?
- 20. Scala:喚醒睡眠線程
- 21. 喚醒睡眠線程
- 22. 信號喚醒線程
- 23. 檢測被阻塞的線程
- 24. 找出線程被阻塞的位置
- 25. Delegate.BeginInvoke回調阻塞調用線程?
- 26. 可以等待的線程,再次喚醒上下文切換
- 27. 喚醒個人線程,而不是忙於在pthreads中等待
- 28. 如何喚醒局域網以喚醒我的電腦
- 29. 使用node.js可以做非阻塞的Facebook API調用嗎?
- 30. 我怎樣才能阻止線程中的塊方法DatagramSocket.receive()
您可能想要將DatagramChannel [設置爲阻止模式](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 2011-02-27 17:36:03