Ich arbeite derzeit an einer Java-Netzwerk-Bibliothek und ich habe ein Problem mit DatagramSocket. Ich habe einen Thread, der auf UDP-Anfragen hört, und immer wenn ich es stoppe und den zugehörigen DatagramSocket schließe, wird es einen Thread geben, der sowieso nicht stoppt.Stoppen Sie einen DatagramSocket Thread
Hier ist ein Codebeispiel, das das Problem reproduziert:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class UDPListener implements Runnable {
private volatile boolean isRunning;
private volatile boolean clientClosed;
private int port;
private DatagramSocket client;
public UDPListener(int listeningPort) {
this.port = listeningPort;
}
public void open() throws SocketException {
this.clientClosed = false;
if (this.client != null) {
this.client.close();
}
this.client = new DatagramSocket(this.port);
}
@Override
public void run() {
this.isRunning = true;
this.clientClosed = false;
DatagramPacket packet = new DatagramPacket(new byte[256], 256);
while (this.isRunning) {
try {
this.client.receive(packet);
} catch (SocketException e) {
if (!this.clientClosed) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
this.client.disconnect();
System.out.println("stopped");
}
public void stop() {
this.isRunning = false;
this.clientClosed = true;
this.client.close();
}
public static void main(String[] args) throws InterruptedException, SocketException {
UDPListener t = new UDPListener(0);
ExecutorService e = Executors.newFixedThreadPool(1);
t.open();
e.submit(t);
Thread.sleep(1000);
t.stop();
}
}
ich das gleiche Problem mit dem Selector-Klasse haben.
Was mache ich falsch?
Es scheint, dass ich nicht klar, in meiner Frage :(war der Thread gestartet mit dem Testamentsvollstrecker hält (“ stopped "wird angezeigt), aber es gibt einen Thread, den ich nicht explizit gestartet habe, der im Hintergrund läuft, wobei der Port verwendet wird und verhindert wird, dass die Anwendung beendet wird – Maliafo