中断从插槽等待IO的线程?

时间:2012-01-11 11:46:41

标签: java multithreading serversocket

我有一个应用程序,用于侦听指定主机名和端口上的传入连接。使用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()或其他内容完成吗?)

3 个答案:

答案 0 :(得分:1)

问题的答案就在于此。你需要关闭套接字。它是使用serverSocket.close()完成的。 Thread.interrupt()并不关心套接字。

答案 1 :(得分:1)

致电serverSocket.close()

我想因为你还没有做IO - 你不能打断它,因为accept()不会抛出InterruptedException,你将无法中断它。线程被中断了,但是那个标志你必须自己检查Thread.isInterrupted()

How can I interrupt a ServerSocket accept() method?

答案 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()方法。