2011-11-01 71 views
9

我在主线程中创建一个DatagramSocket,然后创建一个内部类线程来侦听端口。当我在主线程中关闭DatagramSocket时,它总是遇到错误socket closed,因为在内部类线程中,我调用方法,并且它阻塞了内部类线程。这里是内部类的代码:我怎样才能阻止线程中的块方法DatagramSocket.receive()

class ReceiveText extends Thread 
{ 
    @Override 
    public void run() 
    { 
     while(true) 
     { 
      byte[] buffer = new byte[1024]; 
      DatagramPacket dp = new DatagramPacket(buffer, buffer.length); 
      try { 
       udpSocket.receive(dp);//blocked here 
       byte[] data = dp.getData(); 
       String message = new String(data, 0 , dp.getLength()); 
       setTxtAreaShowMessage(message); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

我想阻止关闭DatagramSocket的前内部类的线程,但不建议stop()方法。我怎样才能做到这一点?

回答

13

关闭套接字,它将阻止receive()调用阻塞。如果您首先设置了一个闭合标志,那么在catch(IOException)块中,如果设置了该标志,则可以安全地忽略该异常。 (您可能也可以在DatagramSocket上使用isClosed()方法而不是标记)

+0

这是一个解决方案,谢谢 – cloud

+0

我也可以证实这一点的工作!很好的方式来打破在数据报套接字的接收循环中的工作线程。 – Nerdtron

1

使用UDP,您可以从另一个线程向套接字发送一个数据报,以解除对read()的阻止。 datagran可以(取决于你的协议)包含'suicide'命令,或者你可以使用线程在read()返回后读取的额外的'shutdown'布尔值。

2

Socket.close()可以做到这一点。或者你可以使用socket.setSoTimeout(1000); setSoTimeout()方法允许您定义以毫秒为单位的超时期限。例如:

//if the socket does not receive anything in 1 second, 
//it will timeout and throw a SocketTimeoutException 
//you can catch the exception if you need to log, or you can ignore it 
socket.setSoTimeout(1000); 
socket.receive(); 

这里是javadoc for setSoTimeout();

默认情况下,超时是0,它是不确定的,通过将其更改为正数,它将仅阻塞您指定的数量。 (请确保您调用socket.receive之前设置())

这里是回答在这个网站的例子: set timeout for socket receive

相关问题