【问题标题】:how to close a thread which is doing IO operation如何关闭正在执行 IO 操作的线程
【发布时间】:2014-08-22 04:04:04
【问题描述】:

我有一个场景:

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

虽然(s = buffer.readline ....)

在 while 循环中,我一直在查看响应并查看字符串“Hello”...如果我得到字符串,我会将响应对象发回..

  1. While 循环一直执行,直到我得到字符串
  2. while 循环一直执行到我按下返回键 (android)

现在这个场景适用于我的第一点。但我在第二点面临问题。

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

但我做不到。我试过了:

  • thread.destroy
  • thread.interrupt
  • 线程 = 空

以上都不起作用。事实上我的线程一直在运行......

我不清楚是线程问题还是流的 While 循环问题。

因为我看到 while 循环总是在执行..

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

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

【问题讨论】:

  • 能否请您发布您的线程代码? :)

标签: java android multithreading io


【解决方案1】:

thread.destroy() 已弃用。不要使用它。

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

线程的逻辑必须通过 (1) 检查 isInterrupted() 状态和 (2) 捕捉InterruptedException异常。

重要的是要同时处理上面的#1 和#2。中断() 线程在某些情况下会导致异常,而在其他情况下会导致 状态无一例外!

一个安全的线程实现是这样的:

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 标志。我认为这是一个不好的做法。
为什么?
因为如果在线程处于等待模式时引发了中断() 即在函数 wait() join() 或 sleep() 内部,线程确实会被唤醒, 但其中断状态将设置为 false

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多