当前位置:编程学习 > C#/ASP.NET >>

线程池的几个问题

当线程池中的线程执行完毕时,是将改线程的状态置为stop了呢,还是将改资源释放掉了呢?
如果没有释放,请问该如何回收?

背景:有个程序需要不断的接受消息(类似qq的服务器端),接受到后放入线程处理。也就是说,每次接受一条消息,都将开辟一个新线程,并且每个新线程指使用一次。为了防止并发量大,我引入了线程池。那么,当每个线程执行完,如果不释放资源的话,线程池内将会驻留很多停止的线程,对内存是极大的浪费。请指教。 --------------------编程问答-------------------- Dispose --------------------编程问答-------------------- 既然是“池”,那资源就会自己管理,不需要手动干预。
如果要手动干预,就不要用池 --------------------编程问答--------------------
引用 2 楼 vwxyzh 的回复:
既然是“池”,那资源就会自己管理,不需要手动干预。
如果要手动干预,就不要用池

领教 --------------------编程问答-------------------- Abort() --------------------编程问答--------------------
引用 2 楼 vwxyzh 的回复:
既然是“池”,那资源就会自己管理,不需要手动干预。
如果要手动干预,就不要用池


我就是问,依照他的管理方式,他会释放已停止的线程吗? --------------------编程问答-------------------- 2楼不是说了吗,线程池有自己的管理,他自己会处理这些的,具体怎么处理,不晓得。 --------------------编程问答--------------------
引用 6 楼 chaozi_249 的回复:
2楼不是说了吗,线程池有自己的管理,他自己会处理这些的,具体怎么处理,不晓得。


那他到底释放没释放呢 --------------------编程问答-------------------- 参考 --------------------编程问答-------------------- http://blog.csdn.net/jjjjj102310253/archive/2008/01/18/2051166.aspx --------------------编程问答-------------------- 不需要管理的

池里的活动线程运行完后会自动销毁,让处于等待的线程执行 --------------------编程问答--------------------
引用 7 楼 frankfuse 的回复:
引用 6 楼 chaozi_249 的回复:
 2楼不是说了吗,线程池有自己的管理,他自己会处理这些的,具体怎么处理,不晓得。


 那他到底释放没释放呢


当然没有释放 --------------------编程问答-------------------- 貌似10楼和11楼的答案冲突了。。需要权威的说法,只好继续关注~~ --------------------编程问答-------------------- 刚才自己做了下测试,发现线程池是不会自动释放资源的。那用线程池的话,到底该怎样自动释放活重复利用已经停止了的线程呢?

付:class Program
   {
      static void Main(string[] args)
      {
         ThreadPool.SetMaxThreads(50,50);

         int max = 2000000;//分配200万个线程,每50个进入池,剩余的排队,1下去了200Mb内存
         for (int i = 0; i < max; i++)
         {
            ThreadPool.QueueUserWorkItem(new WaitCallback( threadMoth),i);
         }
         Console.WriteLine("all queued");
         Console.Read();//执行完毕,发现内存仍没释放。
      }
      static void threadMoth(object o) 
      {
         Console.WriteLine(o.ToString());
         Thread.Sleep(10);
      }
   }

一直等到200万个线程执行完毕,内存仍是被占用MB,结束项目才一下子又回收了200mb.否则不会释放。
到底该如何释放呢,高手赐教。 --------------------编程问答-------------------- 线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量(N1)的线程,放入空闲队列中。这些线程都是处于阻塞(Suspended)状态,不消耗CPU,但占用较小的内存空间。当任务到来后,缓冲池选择一个空闲线程,把任务传入此线程中运行。当N1个线程都在处理任务后,缓冲池自动创建一定数量的新线程,用于处理更多的任务。当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源。 --------------------编程问答-------------------- 既然是池就不用你去维护了,你释放你用到的资源的就行,至于线程怎么回收再利用就归.net管了
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,