如何关闭正在进行IO操作的线程

时间:2014-07-01 14:33:36

标签: java android multithreading io

我有一个场景:

我有一个调用方法的线程,我使用默认HTTP客户端来执行请求。为了获得响应,我打开一个InputStream并使用一个Buffred Reader来读取流。

while(s = buffer.readline ....)

在while循环中,我一直在查看响应并查看字符串"您好" ...如果我收到字符串,我会发回响应对象..

  1. While循环执行直到我得到字符串
  2. while循环执行直到我按后退键(android)
  3. 现在这个场景适用于我的第一点。但我在第二点面临问题。

    当我按回键时,我需要停止我的线程。

    但我无法做到。我试过了:

    • thread.destroy
    • thread.interrupt
    • thread = null

    以上都不奏效。事实上我的线程一直在运行...

    我不清楚问题是否与Thread有关,或问题是流的While循环。

    因为我看到while循环始终在执行..

    请帮助我解决此问题的最佳方法...是关闭线程还是关闭流。

    请帮我找到关闭流并关闭线程的方法。

1 个答案:

答案 0 :(得分:0)

不推荐使用thread.destroy()。不要使用它。

停止IO绑定线程最安全的方法是中断它。

线程的逻辑必须合作:(1)检查isInterrupted()状态和 (2)捕获InterruptedException异常。

重要的是,上述#1和#2都将被处理。中断()a 线程可以在某些情况下导致异常,而在其他情况下导致异常 状态毫无例外!

安全的线程实现如下:

class MyThread {
    private volatile boolean wasStopped;
    public void run() {
       try {
           while (!Thread.currentThread().isInterrupted() && !wasStopped) {
               do_thread_work();
           }
       } catch (InterruptedException e) {
           return; // gracefully stop thread
       }
    }

    public void gracefullyStop() {
        wasStopped = true;
        this.interrupt();
    }
}

停止线程调用

   thread.gracefullyStop();

只要线程逻辑函数(do_thread_work),这种模式就可以正常工作 不会内部捕获&解雇InterruptedException。请注意。

您将看到仅依赖于isInterrupted()检查的其他实现 没有额外的wasStopped标志。我认为这是一种不好的做法。
为什么? 因为如果在线程处于等待模式时引发了interrupt() 即在函数wait()join()或sleep()内部,线程确实会被唤醒, 但其中断状态将设置为false

祝你好运。