当这个新的 Thread() 在 Android 中被 GC 时?

When this new Thread() is GC'ed in Android?

我有一个实用程序 class,我正在尝试写入安全设置,例如,

public static void putIntInSS(final ContentResolver resolver, final String key,
                                                    final int value) {
      new Thread(new Runnable() {
             @Override
             public void run() {
                 Settings.Secure.putInt(resolver, key, value);
             }
         }).start();
}

这个 new Thread() 什么时候进行 GC?在我的应用程序中使用 new Thread() 代替 Handler 好吗?如果以这种方式使用线程有一些缺点,它们是什么?

您的线程将在完成后立即成为 GC 的候选者。参见 here

"Is it good to use new Thread() in my application instead of Handler?"

一句话,"no"。在开始将额外的线程放入生产代码之前,您应该确保了解多线程的所有优缺点以及正确的并发技术。很难夸大基于消息的队列系统(例如 Handler)的优雅,尤其是对于基于消息驱动的 UI 应用程序(Android、Windows)。 Handler 是创建并发假象的有效方法,即使它受限于单个线程的吞吐量。

"some disadvantage of using threads in this way..."

嗯,有很多。我将继续并开始列出清单:

  • 不保证以这种方式执行的操作将按任何特定顺序执行。
  • 不保证操作会及时开始。
  • 由于与 creating/scheduling 线程和 context switching.
  • 相关的开销,该操作实际上可能最终执行得更慢

如果在短时间内开始多次这样的操作,上述问题会变得很严重。此外:

  • 您永远无法知道操作是否(或何时)完成。 (这需要额外的代码。)特别是,当使用传递给 "outer" 方法的对象时,您无法确定线程是否在 "outer" 方法 returns 之前完成使用它们.
  • 该技术增加了代码的复杂性;你可以看到它有多冗长。
  • 您放在另一个线程上的任何操作都必须适当注意并发性。如果存在任何并发访问的可能性,则必须确保调用的方法是线程安全的。可能需要详细的同步工作。
  • 错误处理变得复杂。

很多软件工程都是关于如何避免不必要的复杂性。保持简单。有时您会有苛刻的性能要求;这些项目需要仔细规划并详细了解 CPU 的工作原理。大多数时候,一款软件最重要的是它正确。为此,保持单线程更容易。