线程是否为应用程序添加了大量开销?

时间:2010-08-03 17:22:02

标签: java android multithreading

随着我的应用程序的成熟,我发现自己越来越多地使用线程。到现在为止,我必须拥有大约25个线程,所有线程都在做重要的事情,并在交响乐中一起工作。

但是我注意到我的应用程序居住在15.5MB左右。与浏览器(+/- 35MB)相比,我觉得非常安全,但我确实注意到我的应用程序的常驻大小不断增加。

问题是,添加线程需要多少开销?

我也想知道synchronized关键字是否会出现每个新线程的延迟越来越多?

谢谢!

4 个答案:

答案 0 :(得分:3)

从某些角度来看,新推出的浏览器应用程序有大约20个线程在运行。拥有25个线程并非完全不合理。这实际上取决于你在做什么。

app_1     17309 67    182452 27944 ffffffff 00000000 S com.android.browser
app_1     17310 17309 182452 27944 ffffffff 00000000 S HeapWorker
app_1     17311 17309 182452 27944 ffffffff 00000000 S Signal Catcher
app_1     17312 17309 182452 27944 ffffffff 00000000 S JDWP
app_1     17313 17309 182452 27944 ffffffff 00000000 S Compiler
app_1     17314 17309 182452 27944 ffffffff 00000000 S Binder Thread #
app_1     17315 17309 182452 27944 ffffffff 00000000 S Binder Thread #
app_1     17317 17309 182452 27944 ffffffff 00000000 S CookieSyncManag
app_1     17319 17309 182452 27944 ffffffff 00000000 S WebViewCoreThre
app_1     17321 17309 182452 27944 ffffffff 00000000 S AsyncTask #1
app_1     17322 17309 182452 27944 ffffffff 00000000 S AsyncTask #2
app_1     17323 17309 182452 27944 ffffffff 00000000 S WebViewCoreThre
app_1     17324 17309 182452 27944 ffffffff 00000000 S http0
app_1     17325 17309 182452 27944 ffffffff 00000000 S http1
app_1     17326 17309 182452 27944 ffffffff 00000000 S http2
app_1     17327 17309 182452 27944 ffffffff 00000000 S http3
app_1     17328 17309 182452 27944 ffffffff 00000000 S WebViewWorkerTh
app_1     17329 17309 182452 27944 ffffffff 00000000 S AsyncTask #3
app_1     17330 17309 182452 27944 ffffffff 00000000 S AsyncTask #4
app_1     17332 17309 182452 27944 ffffffff 00000000 S AsyncTask #5

答案 1 :(得分:2)

线程非常有用但同时它们可能是一个威胁。我正在开发一个项目来检查应用程序提出的威胁。如果你通过adb shell运行top,它会专门告诉你应用程序可以运行多少个线程。

您将看到处理器使用率与线程数成正比。这几乎意味着更多的线程数是开销。虽然他们似乎可以保持你的活动不被卡住,但是同步他们的行为可能会变得非常痛苦,然后你可能会陷入僵局,不是很漂亮。多个线程也没有引起对应用程序行为的怀疑。因此,他们应该按照他们的本意来使用。

答案 2 :(得分:2)

如果你一遍又一遍地创建和销毁线程,那么是的,它会带来负担并导致开销。您可以通过利用ThreadPool消除这种情况,ThreadPool保持线程缓存可用于执行。否则,线程是审查进程的方法。

您可能想要考虑对架构进行实际调整。例如,如果为了拥有响应式UI(即等待输入)而保持多个线程处于活动状态,即使特定线程仅在五个菜单跳转之后使用,那么可能没有必要保持线程全部保持活动状态时间。我很少在一个应用程序中使用15个不同的线程,即使该应用程序运行了一个庞大的机器工具....(我有重复的工作线程)。不要忘记仍然需要安排线程,所以不要不必要地保留它们。

最后,请确保您没有遇到与并行程序相同的旧问题;避免死锁等....

答案 3 :(得分:0)

无法控制的线程数可能是应用程序的开销。您的APP似乎已经有更多的移动应用程序线程数。

synchronized确实涉及对象锁定的维护。

结帐是否可以使用ThreadPoolExecutor。这将有助于限制系统中的线程,也减少了创建和销毁线程的开销。