Java 在套接字上中断线程。接收(数据包);抛出错误
我正在开发一个Android 3.1平板电脑应用程序,该应用程序使用以下线程运行服务:Java 在套接字上中断线程。接收(数据包);抛出错误,java,android,multithreading,sockets,Java,Android,Multithreading,Sockets,我正在开发一个Android 3.1平板电脑应用程序,该应用程序使用以下线程运行服务: public class UDPServerThread extends Thread { [ ... ] public void run() { while (!end) { try { byte[] buf = new byte[MESSAGE_SIZE];
public class UDPServerThread extends Thread
{
[ ... ]
public void run()
{
while (!end)
{
try
{
byte[] buf = new byte[MESSAGE_SIZE];
// Wait an incoming message.
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// TODO: Notify Service with packet received
Message msg = new Message();
msg.obj = packet;
mServiceHandler.sendMessage(msg);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public void stopServer()
{
Log.v("UDPServerThread", "stopServer");
if (socket != null)
socket.close();
end = true;
}
}
当我从服务调用stopServer()
方法时,我得到以下错误:
java.net.SocketException: Interrupted system call
当线程在socket.receive(packet)上时,哪种方法是停止线程的正确方法代码>?根据:
当前在此套接字上的I/O操作中阻塞的任何线程都将抛出SocketException
因此,当您调用close
时,socket.receive(packet)如果代码>当前处于阻塞模式,将抛出一个SocketException
,该异常被捕获在catch(IOException e)
块中,并打印堆栈跟踪。根据:
当前在此套接字上的I/O操作中阻塞的任何线程都将抛出SocketException
因此,当您调用close
时,socket.receive(packet)如果代码>当前处于阻塞模式,它将抛出一个SocketException
,该异常被捕获在catch(IOException e)
块中,并打印堆栈跟踪。此异常的唯一真正问题是您无法轻松将其与实际I/O错误区分开来。我建议切换到使用SocketChannel而不是Socket——然后您可以中断服务器线程,它将抛出ClosedByInterruptException,您可以捕获并具体处理该异常。此异常的唯一真正问题是您无法轻松将其与实际I/O错误区分开来。我建议切换到使用SocketChannel而不是Socket——然后您可以中断服务器线程,它将抛出ClosedByInterruptException,您可以捕获并专门处理该异常。如果是Socket.receive抛出该异常,我想这是正常行为,因为你要通过关闭插座来中断通话。谢谢。所以,我不需要担心,不是吗?阅读以下内容:同样在将end设置为true之后,您可能希望等待线程实际完成。(这与您的问题无关,只是一个提示;))如果是socket.receive抛出该异常,我想这是正常行为,因为您实际上是通过关闭socket来中断呼叫。谢谢。所以,我不需要担心,不是吗?阅读以下内容:同样在将end设置为true之后,您可能希望等待线程实际完成。(这与你的问题无关,只是一个提示;)谢谢。所以,我不需要担心,不是吗?这是正常的行为:当你关闭一个插座时,它停止做它正在做的事情,并让你知道它。然后,您可以决定忽略该异常,因为您故意关闭了套接字。但您可能需要运行某种检查,因为它可能由于其他原因而关闭,例如,连接已断开。谢谢。所以,我不需要担心,不是吗?这是正常的行为:当你关闭一个插座时,它停止做它正在做的事情,并让你知道它。然后,您可以决定忽略该异常,因为您故意关闭了套接字。但您可能希望运行某种检查,因为它可能由于其他原因而关闭,例如连接已断开。