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

Java 线程会给应用程序增加很多开销吗?,java,android,multithreading,Java,Android,Multithreading,随着我的应用程序的成熟,我发现自己越来越多地使用线程。到现在为止,我必须有大约25个线程,都做重要的事情,并在交响乐一起工作 然而,我注意到我的应用程序大约有15.5MB。与浏览器(+/-35MB)相比,我感觉非常安全,但我确实注意到我的应用程序的驻留大小不断增加 问题是,添加线程需要多少开销 我还想知道synchronized关键字是否会在出现的每个新线程中遇到越来越多的延迟 谢谢 无法控制的线程数可能会给应用程序带来开销。您的应用程序似乎已经有更多的移动应用程序线程 同步确实涉及对象锁的维护

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

然而,我注意到我的应用程序大约有15.5MB。与浏览器(+/-35MB)相比,我感觉非常安全,但我确实注意到我的应用程序的驻留大小不断增加

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

我还想知道
synchronized
关键字是否会在出现的每个新线程中遇到越来越多的延迟


谢谢

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

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


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

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


您将看到处理器使用率与线程数成正比。这几乎意味着线程越多,开销就越高。虽然它们似乎可以让你的活动在某个时候不被卡住,但同步它们的动作可能会让你感到非常痛苦,然后你可能会陷入僵局,这不是很好。多个线程也会引起对应用程序行为的怀疑。因此,它们应该以其应有的精神加以利用。

如果您一次又一次地创建和销毁线程,那么是的,这将很费力,并导致开销。您可以通过使用线程池来消除这种情况,线程池保持线程缓存可供执行。否则,线程就是遍历进程的方式

您可能需要考虑对体系结构进行实际调整。例如,如果为了有一个响应的UI而保持多个线程处于活动状态(即等待输入),即使某个特定线程仅在五次菜单跳转后才使用,那么可能没有必要始终保持线程处于活动状态。我很少在一个应用程序中使用15个不同的线程,即使该应用程序运行的是一台大型机床……(尽管我有重复的工作线程)。不要忘记线程仍然需要调度,所以不要不必要地保留它们


最后,确保你没有遇到与并行程序相同的老问题;避免死锁等…

从某种角度来看,新推出的浏览器应用程序大约有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

25个线程对于移动应用程序来说是很多线程。它的作用是什么?如果你问这个问题,可能是时候开始重新思考你的架构了。应该注意的是,线程99%的时间都在睡觉,只有在必要时才会醒来执行工作@silico是一款蓝牙应用程序,可与车辆的嵌入式计算机进行高级通信。多个蓝牙连接,屏幕显示,以及必须按计划执行的后台任务。@George请理解,作为一个人的编程团队并不容易。我有很多东西要学,我正在努力在学习的同时编写有效的代码。如果你有具体的建设性批评,我欢迎。@Brad我不是在侮辱你或你的编程能力——相信我,在一个人的编程团队中,你不是唯一一个人。在这一点上,告诉您,如果您的应用程序在使用的线程逻辑中不断膨胀,导致有缺陷的设计,那么花一段时间重新评估您是如何完成已着手寻找解决方案的问题,这无疑是一种建设性的批评。=)几乎所有线程在应用程序的生命周期中只创建一次。谢谢你关于这台机床的说明,这有助于我们了解它。是的,我使用了这么多,以保持应用程序对用户的响应非常迅速。我还发现,在异步多线程环境中,许多应用程序层可以很好地协同工作。我喜欢线程池的想法,谢谢。有趣的想法:“更多线程~=不道德的活动”。。。我所有的线程都是正常的,但我会考虑一下:)谢谢你的adb建议,我没有意识到顶级实用程序显示线程!呃,从安全角度来看,对于一个有很多线程的应用程序来说,没有什么可疑之处。@hackbod你也许是对的,但我发现线程是一个讨厌的东西。一些应用程序的活动我不关心,一旦我退出,不知何故,通过使用线程来保持进程的活力。既然我要调用可疑活动,线程就不能使进程保持活动状态。如果应用程序写得不好(这是不可取的),它们当然可以在应用程序处于后台时继续运行。(虽然由于后台调度类和唤醒锁等原因,可能没有Android上那样糟糕。)当然,除非你擅长多线程(大多数开发人员都不擅长),否则你希望远离原始线程类和锁定,并使用AsyncTask等更高级别的工具。也就是说,AsyncTask的池可能类似于8个线程,Binder的池是16个线程,因此这些线程可以生成大量线程。:)