安卓系统中的线程限制是什么?

6

安卓系统有线程数量限制吗?

我在应用程序中创建了很多线程,而且编译时不知道线程数。如何获取允许的线程数?

我得到的信息是:

05-11 16:24:19.441  11131-11194/? E/dalvikvm﹕ Thread creation failed (err=Invalid argument)
05-11 16:24:19.461  11131-11131/? A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 11131 (id.mykeyboard)

将异常处理作为一种方法并不是一个好主意,因为我必须选择另一种方法来处理它,而这种方法取决于最大线程限制。


为什么不使用AsyncTask而是使用自己的线程?它使用线程池来解决关于最大线程数的任何问题。 - Kostas Kryptos
那你为什么不使用线程池呢? - Kostas Kryptos
使用ThreadPool无法解决此问题,因为它意味着将同时运行MAX_THREADS_LIMIT线程。我需要更精细的控制-如果需要的线程数小于MAX_THREADS_LIMIT,则使用线程。否则,我将采用完全不同的方法。 - 4ntoine
MAX_THREADS_LIMIT是硬件、JVM和操作系统特定的。理论上,MAX_THREADS_LIMIT = 进程的用户地址空间除以线程堆栈大小,但实时查找绝对数字几乎是不可能的。 - Kostas Kryptos
请看此贴:https://dev59.com/BXRA5IYBdhLWcg3w9y50 - Lavekush Agrawal
显示剩余4条评论
2个回答

0

据我所知,代码中没有强制规定最大值。话虽如此,即使对于网络I/O,由于Android设备的CPU速度相当慢,RAM也相当有限,因此很快就会出现收益递减的情况。

否则,请使用您在问题中提到的其他“处理方法”。


我已经回复过了,使用AsyncTask无法解决问题。使用线程池(无论是AsyncTask还是ThreadPool)意味着只能同时运行N个线程,并且不能如预期般减少调用时间。 - 4ntoine
好的,谢谢你告诉我。我没有看到那个!我会把那段删除。 - explodingcreeperssss

0
通常情况下,您不能创建超过1024个受fd限制的线程。 许多对象,例如支持ipc传输的套接字、文件和其他对象都将使用fds。 一个线程将消耗1MB的内存。
线程数最多可能达到300-400个。线程越少,性能越好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接