1
我目前工作的一个Java的网络图书馆,我面临着DatagramSocket的一个问题。我有一个线程持续监听UDP请求,并且每当我停止并关闭其关联的DatagramSocket时,都会有一个线程不会停止。停止一个DatagramSocket线程
这里是重现该问题的代码示例:
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();
}
}
我与选择类同样的问题。
我做错了吗?
看来我是不是我的问题:(清除线程开始与执行停止(”停止“),但有一些线程我没有明确启动,继续在后台运行,留下使用的端口并阻止应用程序退出 – Maliafo