Java 在套接字上中断线程。接收(数据包);抛出错误

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];

我正在开发一个Android 3.1平板电脑应用程序,该应用程序使用以下线程运行服务:

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之后,您可能希望等待线程实际完成。(这与你的问题无关,只是一个提示;)谢谢。所以,我不需要担心,不是吗?这是正常的行为:当你关闭一个插座时,它停止做它正在做的事情,并让你知道它。然后,您可以决定忽略该异常,因为您故意关闭了套接字。但您可能需要运行某种检查,因为它可能由于其他原因而关闭,例如,连接已断开。谢谢。所以,我不需要担心,不是吗?这是正常的行为:当你关闭一个插座时,它停止做它正在做的事情,并让你知道它。然后,您可以决定忽略该异常,因为您故意关闭了套接字。但您可能希望运行某种检查,因为它可能由于其他原因而关闭,例如连接已断开。