Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 中断被阻止的线程等待来自套接字的IO?_Java_Multithreading_Serversocket - Fatal编程技术网

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,否则编译器可能会以这样的方式对其进行优化,不同的线程将看到不同的值。