2012-01-11 74 views
0

我有一个应用程序,用于监听指定主机名和端口上的传入连接。通过方法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()什么来实现?)

+0

正如您所指出的那样,使用标准套接字时,只能通过关闭套接字来实现。这里有几个关于SO处理相同问题的问题,例如http://stackoverflow.com/questions/1510403/how-to-unblock-a-thread-blocked-on-serversocket-accept – 2012-01-11 11:57:56

+0

你是什么意思,它不起作用?它是否会抛出任何异常?或者只是继续平时? – medopal 2012-01-11 12:01:45

+0

@medopal线程只是继续运行而不终止它。 – 2012-01-11 12:05:16

回答

1

呼叫serverSocket.close()

我猜,因为你没有做IO还没有 - 你不能打断它,因为accept()不抛出InterruptedException,你将不能够中断它。该线程中断,但该标志,你必须自己检查Thread.isInterrupted()

请参阅How can I interrupt a ServerSocket accept() method?

+0

既然'accept()'不能被打断(这在我看来有点奇怪,但是这么做),我想我必须使用'close()'......感谢您的帮助! – 2012-01-11 12:07:25

+0

没有问题很高兴帮助。 – polve 2012-01-11 12:15:53

1

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

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

+0

不好。你至少应该声明'stop'是volatile的,否则编译器可能会以这种方式优化它,以至于不同的线程会看到不同的值。 – ivant 2014-08-13 13:26:05