我有一个应用程序,用于侦听指定主机名和端口上的传入连接。使用listen()
方法调用侦听(见下文),该方法使用ServerSocket.accept()
不断等待传入连接,创建一个新的Thread
来处理输入流。
private ServerSocket serverSocket;
private Thread listenerThread;
public void listen() throws IOException {
this.listenerThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Socket socket = TheServerClass.this.serverSocket.accept();
// Create new thread to handle the incoming connection
}
catch (IOException exc) { }
}
}
});
this.listenerThread.start();
}
现在我想停止listenerThread
的运行。但是当我拨打this.listenerThread.interrupt()
时,这不起作用
我以为你可以通过打断它来阻止一个线程,那么为什么这不起作用?
(注意:一种可能的解决方案是使用ServerSocket
关闭this.serverSocket.close()
,但可以使用interrupt()
或其他内容完成吗?)
答案 0 :(得分:1)
问题的答案就在于此。你需要关闭套接字。它是使用serverSocket.close()
完成的。 Thread.interrupt()
并不关心套接字。
答案 1 :(得分:1)
致电serverSocket.close()
,
我想因为你还没有做IO - 你不能打断它,因为accept()
不会抛出InterruptedException,你将无法中断它。线程被中断了,但是那个标志你必须自己检查Thread.isInterrupted()
。
答案 2 :(得分:0)
使用此:
public class MyThread extends Thread {
private boolean stop;
private ServerSocket serverSocket;
public MyThread(ServerSocket ss) {
this.serverSocket = ss;
this.stop = false;
}
public void setStop() {
this.stop = true;
if (this.ss != null) {
this.ss.close();
}
}
public void run() {
while (!stop) {
try {
Socket socket = serverSocket.accept();
// Create new thread to handle the incoming connection
}
catch (IOException exc) { }
}
}
}
并且从listen()
方法只需调用线程的setStop()
方法。