我打電話給Socket.close()
關閉插座。這將在該線程中產生IOException。所以在這之前,我會設置一個像closed = true;
這樣的標誌,並讓其他線程在打印錯誤之前檢查它,即如果您已關閉,請不要打印IOException。像這樣的東西。
public class SocketListener implements Runnable, Closeable {
final MulticastSocket socket;
final Consumer<DatagramPacket> packetConsumer;
volatile boolean closed;
public SocketListener(MulticastSocket socket, Consumer<DatagramPacket> packetConsumer) {
this.socket = socket;
this.packetConsumer = packetConsumer;
}
@Override
public void run() {
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
try {
while(!closed) {
socket.receive(packet);
packetConsumer.accept(packet);
}
} catch (IOException e) {
if (!closed)
e.printStackTrace();
}
}
@Override
public void close() throws IOException {
closed = true;
socket.close();
}
}
例如,在你的主線程可以做
MulticastSocket socket = ...
Consumer<DatagramPacket> packetConsumer = ...
try (SocketListener listener = new SocketListener(socket, packetConsumer)) {
boolean finished = false;
do {
// read from the console
if (some condition)
finished = true;
} while(!finished);
} // calls close() for you.
有點困惑在這裏。從控制檯讀取的線程如何與套接字偵聽器的關閉進行交互?我認爲對於我自己的代碼,我會讓我的客戶端實現Runnable接口,但我只是有點不確定你打算如何交互這兩個線程。如果我的問題看起來很平凡,我並沒有在線程方面做太多的事情。 – user16728
@ user16728您有控制檯讀取線程調用'close()'方法。 –
@ user16728我爲我的答案添加了一個示例。 –