下载图片一般都是单任务伦循。但是如果每次下载图片都开启一个工作线程会导致什么?

如题。工作线程起多了会导致什么?会不会导致内存益出。然后崩了?

2个回答

首先无限制创建线程是不可能的~不同的系统给的限制可能不同:有的是1M,有的更多~但绝不会出现分配线程过多导致死机的情形~

如果需要下载多个图片,用一个线程的多首先代码编写会方便一些,当然你把线程包装成方法,倒着没多大差别。接下来就讨论多线程的问题。
首先说线程运行。如果你已经知道线程进程和核心,会更好理解一些。windows操作系统下线程是cpu可执行的最小单位,而操作系统分配内存等资源时,是以进程为单位的,以前大家考虑的都是进程问题,后来因为程序越来越复杂,线程更多被人熟知,线程是依赖于进程的,你开启很多个线程,也是在一个应用进程里,相当于一个爸爸有很多儿子,现在假设你只有一个线程,而进程调度是分时复用的,那么当挨到该线程所在的进程时,就只会运行这一个线程,线程转换虽然不需要分配资源,但一些基本的信息还是要保存的,也就是说一个线程结束开启另一个线程是需要耗时的,也需要额外的资源(这些建立在该进程运行态的短时间内。)
好了,上面说了你开辟多个线程,有可能多消费资源和时间,现在考虑另一个方面问题,操作系统会不会同时执行一个进程内的多个线程。假如你的计算机采用的调度只允许一个进程在一个进程队列,也就是说即便你的电脑有多个核心,却因为限定一个进程在某一时刻只能在一个核心上而浪费了多余的能力,那么你的开辟多个线程的想法就只会给操作系统带来负担,并且因为线程转换使得下载图片任务变慢。
接着讨论另一种情况,假设你的电脑是多核心(现在电脑基本都是多核心了),线程调度算法是时间片轮转的,也允许一个进程的多个线程同时运行在多个处理器上,但是,此时你打开了很多应用程序,也就是说此时有很多的进程处于就绪态,等待态,当然,其中很多处于运行态的,现在又加入了你的应用进程,因为这是支持一个进程中多个线程并发执行的(是并发,不是并行),所以系统调度的颗粒度相当于变成了线程,可以直接指定接下来执行的线程,那么可以这样理解:如果原本需要执行的线程数为m,你加入的线程数为n,一共有k个能运行线程的处理器,且假定每个处理器分配的线程个数一样,那么你的程序运行时间占的比重就是n/(m+n),这就是说,你加入的线程数越多,比重就越大,你加入的线程任务就执行的越快……说到这你是不是觉得开多线程挺好?然而,假如有一个线程很倒霉,被排在了最后(因为系统调度是无规律的),那用的时间会少么?再假如你所有线程要执行的任务本来可以在一个时间片内执行完毕,那么你完成任务的效率就是(1-Ψ)k,Ψ代表你倒霉程度,如果你很幸运,第一波可以执行的k个线程中有你刚加入的那个,那你就瞬间完成任务了,再说最倒霉不也是跟上面一样最后执行?再假如线程执行一个时间片不够,那么你看看你一个程序给系统调度带来多大麻烦,它得不停的算啊算的,想该如何调度,它不累么?(以上推导不具备科学要素,不要深究,公式什么的明白意思就行,又不是数学专业的)
最后一种情况很理想,假如你下载图片很耗时间,且此时你电脑有很多个cpu,且操作系统支持同一个进程中多个线程并发执行,且你最近运气特别差,百里挑一都有你,那么打开如此之多的线程还是有用处的。
还有啊,如果你是从一个url下载多个图片……,那这个问题就真的没意义了。
个人观点,不喜勿喷,不过这种问题易被删。我也是吃饱撑的……

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问