当这个新的 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 的工作原理。大多数时候,一款软件最重要的是它正确。为此,保持单线程更容易。
我有一个实用程序 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 的工作原理。大多数时候,一款软件最重要的是它正确。为此,保持单线程更容易。