【问题标题】:What happens to this thread runnable at the end once it is completed?完成后,这个可运行的线程最后会发生什么?
【发布时间】:2011-12-23 15:22:46
【问题描述】:

我有这个线程,它从服务器下载一些图像。因此,一旦它下载了图像,我就会调用处理程序并进行 UI 更新。因此,由于线程的 stop() 已被弃用,因此我无法使用它。我在这里有两个问题。

  1. 这个线程最后会发生什么?(意味着在我调用处理程序方法之后它会发生什么)。
  2. 或者如何在不使用 stop() 的情况下停止该线程?

这是我的代码。

handler=new Handler()
    {
        public void handleMessage(Message msg)
        {
            if(msg.what==0)
            {
                //UI Updation takes place. 
            }
        }
    };



final Thread t = new Thread(new Runnable() {
        public void run() {
            Log.i("Inside Thread", "Downloading Images...");
                     myDownlaodMethod();
            handler.sendEmptyMessage(0);
        }
    });
    t.start();

【问题讨论】:

    标签: java android multithreading android-handler


    【解决方案1】:

    线程将自行结束并死亡。你不必自己结束它。如果不创建新的 Thread 对象,您将无法重新启动它。垃圾收集器将处理需要释放的任何内存。只要您持有对它的引用,该对象就会保留在内存中。删除引用,垃圾收集器将像删除其他对象一样删除该对象。

    【讨论】:

    • 那么如果在某些情况下我想在中间停止这个线程怎么办。我如何在android中做到这一点
    • 如果它有一个永久循环,你必须有一个像 while(a){// do everything } 这样的布尔条件,并在你希望它死时将 a 设置为 false。如果您的myDownloadMethod() 无法被中断和取消,那么您将不得不创建一个或有一个超时让它死掉。您不应该只是在执行过程中切断线程。最佳做法是让它运行到最后。很多时候,您可以为此使用Thread.interrupt()
    • 感谢您的澄清。
    • @DeeV 查看 ExecutorService 和 Executors。对这些人有很多想法,我经常看到开发人员重新实现这些类的功能。
    • 这看起来可能对此有所帮助。这可能是AsyncTask 所包含的内容,因为它的工作原理类似。
    【解决方案2】:

    您应该查看ExecutorServiceExecutors

    如果它与普通 Java 相同,那么它提供了一些强大的线程管理,包括一次关闭所有线程。

    【讨论】:

    • 他用的是Android,所以AsyncTask可能比Executors更合适。
    • 按照您的建议使用interrupt 关闭线程并非易事,因为必须修改线程才能正确处理中断。
    • @toto2 是的,我同意。然而,任何东西都比普通的线程好。您应该使用 AsyncTask 发布答案(当时我不知道)。
    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 2013-11-26
    • 2018-12-11
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多