【问题标题】:Interrupt a thread while is on socket.receive(packet); throws an error在 socket.receive(packet) 上中断线程;抛出错误
【发布时间】:2012-07-04 17:41:12
【问题描述】:

我正在开发一个 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); 上停止该线程的正确方法是什么?

【问题讨论】:

  • 如果是 socket.receive 抛出该异常,我想这是正常行为,因为您实际上是通过关闭套接字来中断调用。
  • 谢谢。所以,我不用担心,不是吗?
  • 同样在将 end 设置为 true 之后,您可能希望等到您的线程真正完成。 (这与您的问题无关,只是一个提示;))

标签: java android multithreading sockets


【解决方案1】:

这个异常唯一真正的问题是你不能轻易地将它与实际的 I/O 错误区分开来。我建议切换到使用 SocketChannel 而不是 Socket——然后你可以中断你的服务器线程,它会抛出一个 ClosedByInterruptException,你可以专门捕获和处理它。

【讨论】:

    【解决方案2】:

    根据javadoc of the close method

    当前在此套接字上的 I/O 操作中阻塞的任何线程都将抛出 SocketException。

    所以当你调用closesocket.receive(packet);时,如果它当前处于阻塞模式,将抛出一个SocketException,它会被你的catch (IOException e)块捕获并打印堆栈跟踪。

    【讨论】:

    • 谢谢。所以,我不用担心,不是吗?
    • 这是正常的行为:当你关闭一个套接字时,它会停止它正在做的事情并让你知道它。然后您可以决定忽略该异常,因为您故意关闭了套接字。但是您可能想要运行某种检查,因为它可能由于其他原因而被关闭,例如连接已丢失。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2011-05-04
    • 2019-04-19
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多