Java 中断被阻止的线程等待来自套接字的IO?
我有一个应用程序可以监听指定主机名和端口上的传入连接。侦听是通过方法Java 中断被阻止的线程等待来自套接字的IO?,java,multithreading,serversocket,Java,Multithreading,Serversocket,我有一个应用程序可以监听指定主机名和端口上的传入连接。侦听是通过方法listen()(见下文)调用的,该方法使用ServerSocket.accept()不断等待传入连接,创建一个新的线程来处理输入流 private ServerSocket serverSocket; private Thread listenerThread; public void listen() throws IOException { this.listenerThread = new Thread(new
listen()
(见下文)调用的,该方法使用ServerSocket.accept()
不断等待传入连接,创建一个新的线程来处理输入流
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.close()
完成的Thread.interrupt()
不关心套接字。调用serverSocket.close()
我想既然你还没有做IO,你就不能中断它,既然accept()
没有抛出InterruptedException,你就不能中断它。线程被中断,但您必须自己检查该标志thread.isInterrupted()
看 使用以下命令:
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()
方法。正如您所指出的,在使用标准套接字时,这只能通过关闭套接字来实现。这里有几个问题,所以要处理同一个问题,例如,你说它不工作是什么意思?它会抛出异常吗?还是通常继续?@medopal线程只是继续运行而没有终止它。由于accept()
不能被中断(在我看来这有点奇怪,但就是这样),我想我必须使用close()
。。。谢谢你的帮助!不好的。您至少应该将stop
声明为volatile,否则编译器可能会以这样的方式对其进行优化,不同的线程将看到不同的值。