中断阻塞从套接字等待IO的线程?
我有一个应用程序,用于监听指定主机名和端口上的传入连接。通过方法listen()
(请参见下文)调用侦听,该方法使用ServerSocket.accept()
不断等待传入连接,并创建新的Thread
来处理输入流。中断阻塞从套接字等待IO的线程?
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()
时,这不起作用。
我以为你可以通过中断它来阻止一个线程,那么为什么不工作呢?
(注意:一个可能的解决方案是关闭使用this.serverSocket.close()
的ServerSocket
,但它可以与interrupt()
什么来实现?)
呼叫serverSocket.close()
,
我猜,因为你没有做IO还没有 - 你不能打断它,因为accept()
不抛出InterruptedException,你将不能够中断它。该线程中断,但该标志,你必须自己检查Thread.isInterrupted()
。
既然'accept()'不能被打断(这在我看来有点奇怪,但是这么做),我想我必须使用'close()'......感谢您的帮助! – 2012-01-11 12:07:25
没有问题很高兴帮助。 – polve 2012-01-11 12:15:53
答案就在问题。您需要关闭套接字。它使用serverSocket.close()
完成。 Thread.interrupt()
不关心套接字。
使用此:
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()
方法。
不好。你至少应该声明'stop'是volatile的,否则编译器可能会以这种方式优化它,以至于不同的线程会看到不同的值。 – ivant 2014-08-13 13:26:05
正如您所指出的那样,使用标准套接字时,只能通过关闭套接字来实现。这里有几个关于SO处理相同问题的问题,例如http://stackoverflow.com/questions/1510403/how-to-unblock-a-thread-blocked-on-serversocket-accept – 2012-01-11 11:57:56
你是什么意思,它不起作用?它是否会抛出任何异常?或者只是继续平时? – medopal 2012-01-11 12:01:45
@medopal线程只是继续运行而不终止它。 – 2012-01-11 12:05:16