【问题标题】:Android terminating a thread created through runnableAndroid终止通过runnable创建的线程
【发布时间】:2011-08-22 20:22:42
【问题描述】:

假设在我的应用程序的各个方面,我创建并启动了一个新的可运行对象,如下所示:

new Thread(new Runnable() { 
    public void run() {
    while(true) {
       //do lots of stuff
       //draw lots of stuff on screen, have a good ol time
       //total loop processing time abt 1250-1500ms
       //check for conditions to stop the loop, break;
   }    }   }

现在,除了我的 while 循环中的 break; 之外,还有什么方法可以在执行过程中终止该线程?我希望能够从父线程中立即明确地杀死它,就像用户刚刚请求加载不同的地图一样。在每 5 行左右的代码之后插入一个if (stopFlag) break;(在父线程中设置)感觉很笨拙。

我查看了 Runnable 和 Thread 的方法,但我只是看不到它。有人知道一个绝妙的技巧吗?

【问题讨论】:

    标签: android multithreading terminate runnable


    【解决方案1】:

    您可以使用AsyncTask 并调用cancel 来取消线程。

    【讨论】:

    • 我将研究修改我的代码以利用它。我会尽快告诉你结果如何。这看起来更优雅。
    • @Eric 你从来没有告诉我们结果如何! : (
    【解决方案2】:

    代替while (true),您可以检查在应该停止线程/可运行时会正确更改的条件或标志。这似乎是 suggested strategy,因为 Thread.stop() 已被弃用。

    【讨论】:

    • 这不是一个好的解决方案,因为它仍然会阻止阻塞调用 - 例如,如果在 while 循环中有很长的 HTTP 下载。
    • 那么AsyncTask的实现如何考虑到你说的用例呢?
    • 我不这么认为。我不得不解决它并在每个 HttpURLConnection 上手动调用 disconnect() - 成功了(但我相信这只能从 Gingerbread 开始,有一个关于它的 Android 错误线程code.google.com/p/android/issues/detail?id=11705
    【解决方案3】:

    您可以按照建议使用 AsyncTask,这在这种情况下可能效果最好。我相信您也可以使用 interrupt() 方法,如果您不在 Android 中,最好使用该方法,但仍然需要明确检查它是否被中断:

    Thread t = new Thread(new Runnable() {
        public void run() {
            while (true) {
                // do some stuff
                if (isInterrupted()) {
                    break;
                }
            }
         });
    t.start();
    
    // Whoa! Need to stop that work!
    t.interrupt();
    

    【讨论】:

    • 这不是一个好的解决方案,因为它仍然会阻止阻塞调用 - 例如,如果在 while 循环中有很长的 HTTP 下载。
    • 主线程不阻塞;这会创建一个新线程,然后在新线程上进行长 HTTP 下载(因为调用的是 start() 而不是 run())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多