代码之家  ›  专栏  ›  技术社区  ›  Brad Hein

线程会给应用程序增加很多开销吗?

  •  6
  • Brad Hein  · 技术社区  · 14 年前

    随着我的应用程序的成熟,我发现自己在线程上找到了越来越多的用途。到目前为止,我必须有大约25条线,所有的线都在做重要的事情,一起在交响曲中工作。

    不过,我注意到我的应用程序的内存约为15.5MB。与浏览器(+/-35MB)相比,我觉得很安全,但我确实注意到我的应用程序的驻留大小在不断增加。

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

    我还想知道 synchronized 关键字遇到的每个新线程的延迟越来越大?

    谢谢!

    4 回复  |  直到 10 年前
        1
  •  2
  •   Shouvik    10 年前

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

    您将看到处理器的使用与线程的数量成正比。这意味着线程数量越多,开销就越大。虽然他们似乎让你的活动在时间上保持自由,但同步他们的行为可能会成为一种真正的痛苦,然后你可能会陷入僵局,不是很漂亮。同时,多个线程数也会引起对应用程序行为的怀疑。因此,它们应该按照它们的本意来使用。

        2
  •  3
  •   hackbod    14 年前

    从某种角度来看,一个新发布的浏览器应用程序大约有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
    
        3
  •  2
  •   Ayubinator    14 年前

    如果您一次又一次地创建和破坏线程,那么是的,这将是一种负担,并导致开销。您可以通过使用threadpool来消除这一点,threadpool使线程的缓存可供执行。否则,线程就是遍历进程的方法。

    您可能需要考虑对架构进行实际调整。例如,如果为了有一个响应的用户界面(即等待输入)而使多个线程保持活动状态,即使一个特定的线程只在五次菜单跳转之后才使用,那么可能不需要一直保持线程的活动状态。我很少在一个应用程序中使用15个不同的线程,即使该应用程序运行一个大型机床时也是如此……(我有重复的工作线程)。别忘了线程仍然需要调度,所以不要不必要地将它们保留在周围。

    最后,确保并行程序不会遇到相同的老问题;避免死锁等。

        4
  •  0
  •   YoK    14 年前

    不可控制的线程数可能会增加应用程序的开销。您的应用程序似乎已经有更多的线程用于移动应用程序。

    同步确实涉及对象锁的维护。

    如果可以使用ThreadPool Executor,请签出。这将有助于限制系统中的线程,同时减少创建和销毁线程的开销。