2011-02-27 79 views

回答

3

使用DatagramChannel讀取UDP數據包並中斷讀取線程。根據Thread.interrupt(和DatagramChannel)的文檔,讀取操作將拋出ClosedByInterruptException。

+0

您可能想要將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

2

JB公佈瞭解決方案的一部分。但是如果你不使用NIO通道,這裏的解決方案AFAIK將關閉套接字,並在你的可運行/可調用中處理它。 I did something similar一會兒回來,用TCP套接字,如果你有興趣的話。解決方案的可行性還取決於在你的情況下關閉插座是否可以接受。在這種情況下,使用NIO解決方案會更有意義。

0

設置一個更短的讀取超時時間,讓您的read方法在它認爲發生讀取超時之前循環正確的次數。在其他(n-1)個案中檢查了Thread.isInterrupted()。