如何终止套接字连接上的线程阻塞

时间:2016-01-26 17:16:21

标签: java android multithreading sockets

在我的Android应用程序中,我的活动正在为一些套接字网络操作启动另一个线程,并且此线程始终在等待来自套接字的传入数据(在dev循环中阻塞read()函数)

现在,当我的活动被破坏时,我想保持清洁,并销毁该线程。为了实现此功能,我定义了一个while变量volatile boolean,该变量将初始化为isSupposedToStop,当false被调用时,它会将onStop()设置为{ {1}},调用导致boolean上的线程阻塞的true抛出socket.shutdownInput(),然后读取read()布尔值,知道是假设的停止。(如果你有更好的方式随时讨论它)。

所以,在我连接套接字后的IOException实现中,我有:

isSupposedToStop

run()中,我有:

sock= new Socket("127.0.0.1", 1234);
InputStream is= sock.getInputStream();
byte[] buffer= new byte[200];
while(true){
    if(isSupposedToStop) return;
    try {
        is.read(msgSizeBuff, 0, 200);
    } catch(IOException e){
    }
    if(isSupposedToStop) return;
    //do something with the received message
}

运作良好。当线程正在等待新数据(阻止onStop())时,isSupposedToStop= true; if(sock!= null) { try { sock.shutdownInput(); sock.close(); } catch (IOException e) { } } thread.join() 会在read()调用read()时立即引发IOException,并且控件又回到读取我的布尔值并退出的线程。 但是如果在线程仍在等待建立连接时调用onStop()shutdownInput()上的阻塞),则会发生问题,因此如果主机关闭,例如应用程序冻结约3秒,那么你建议只省略onStop()电话?或者有没有办法唤醒这个线程?

2 个答案:

答案 0 :(得分:3)

一旦你调用read方法就基本上被阻止了 - 你只能通过中断线程来逃避。

public void test() {
    Thread socketThread = new Thread(new Runnable() {

        @Override
        public void run() {
            System.out.println("Hello");
        }
    });
    // Do your stuff.
    //...
    // Time to quit - should abort any blocked reads.
    socketThread.interrupt();
}

另一种选择 - 这可能根本不起作用 - 是使用available的{​​{1}}方法。

InputStream

答案 1 :(得分:1)

新的Socket不应该阻止网络。甚至不是SYN / ACK。

因此,您可以在构建后立即设置SOTimeout()。但是,为了公平起见,你不会把它设置为不到3秒。

你建议响应一个socket.close()需要3秒钟......所以我担心它不能更快​​,但你可以尝试一个thread.interrupt(),以防它处于可中断状态(非本地)代码。