随着我的应用程序的成熟,我发现自己越来越多地使用线程。到现在为止,我必须拥有大约25个线程,所有线程都在做重要的事情,并在交响乐中一起工作。
但是我注意到我的应用程序居住在15.5MB左右。与浏览器(+/- 35MB)相比,我觉得非常安全,但我确实注意到我的应用程序的常驻大小不断增加。
问题是,添加线程需要多少开销?
我也想知道synchronized
关键字是否会出现每个新线程的延迟越来越多?
谢谢!
答案 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。这将有助于限制系统中的线程,也减少了创建和销毁线程的开销。