现在有两种做法创建一个Thread,然后ThreadPool里分配多个workerItem。这样做不好的地方是每执行一轮循环,必须要等一轮的各个worker都结束之后,才能开始下一轮。
还有一种做法是根据需要创建多个Thread,单独执行。这样就互不相干了。这样做有缺点?

解决方案 »

  1.   

    再者,我的多线程程序开启后,为何cpu狂飙啊。只有sleep的时候是好的。
      

  2.   

    多线程只要是在运行的状态下,占用cpu是不可避免的吗?
      

  3.   


    要了解多线程。它是在充分利用cpu资源,同时做几件事儿,sleep的时候线程都休眠了,什么也不做,当然cpu没什么大动作了。还有建议使用线程池,在线程比较杂乱的情况下。如果单独执行一个或两个操作直接new也无所谓,按需来分,一般还是用线程池的多。
      

  4.   

    我有个类似的问题需要解决!1.我用的是线程池,效果是这样的,我想同时做很多事,每个线程互相不干扰,这些都实现了,我想知道的就是如果我同时创建了n个线程,其中如果有个线程不需要了我就把他释放!那如果要是我下次做这个请求还想操作的话就只能重新创建线程?
    2.我的想法是既然sleep的时候不占用内存,那我是不是可以把暂时不需要的线程给sleep呢?等到想用的时候我在用?
      

  5.   

    引用 5 楼 gouhan02 的回复:
    再者,我的多线程程序开启后,为何cpu狂飙啊。只有sleep的时候是好的。要了解多线程。它是在充分利用cpu资源,同时做几件事儿,sleep的时候线程都休眠了,什么也不做,当然cpu没什么大动作了。还有建议使用线程池,在线程比较杂乱的情况下。如果单独执行一个或两个操作直接new也无所谓,按需来分,一般还是用线程池的多。 
     
      

  6.   


    你这叫做线程池?你说的“我用的是线程池”是哪一家的线程池呢?肯定不是.net中的,因为任何介绍.net框架的线程池知识的文章(例如msdn)都不大可能留下这个疑问。
      

  7.   

    使用.net进行开发就要先学.net框架知识,如果在丰富内容的.net框架技术中找不到真实地对应的东西,时使用一些其它平台的人(例如会一点java的人)时髦名词时就要当心了。
      

  8.   

    .net框架的线程池类不过这些东西[HostProtectionpublic static class ThreadPool
    {
        public static bool BindHandle(SafeHandle osHandle);
        public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads);
        public static void GetMaxThreads(out int workerThreads, out int completionPortThreads);
        public static void GetMinThreads(out int workerThreads, out int completionPortThreads);
        public static bool QueueUserWorkItem(WaitCallback callBack);
        public static bool QueueUserWorkItem(WaitCallback callBack, object state);
        public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
        public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
        public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, TimeSpan timeout, bool executeOnlyOnce);
        public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
        public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
        public static bool SetMinThreads(int workerThreads, int completionPortThreads);
        public static unsafe bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapped);
        public static bool UnsafeQueueUserWorkItem(WaitCallback callBack, object state);
        public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
        public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
        public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, TimeSpan timeout, bool executeOnlyOnce);
    (false)]
        public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
    }最基本地,只要会用一样:QueueUserWorkItem,这就可以了。它是创建一个回调方法,而根本不需要创建什么Thread(何时创建的Thread你根本不知道)。至于什么是“一轮循环”我就看不懂这是何意了。