Пример #1
0
 /// <summary>
 /// 回收线程
 /// </summary>
 /// <param name="entity"></param>
 public void StoreThread(QYThreadEntity entity)
 {
     if (entity != null)//不信任态度
     {
         lock (this.lockObj){
             this.idleThreadList.AddLast(entity);
         }
     }
 }
Пример #2
0
        /// <summary>
        /// 请求线程
        /// </summary>
        /// <returns></returns>
        public QYThreadEntity RequestThread()
        {
            QYThreadEntity threadEntity = null;

            lock (this.lockObj){
                if (this.idleCount > 0)//如果有空闲线程
                {
                    threadEntity = this.idleThreadList.First.Value;
                    this.idleThreadList.RemoveFirst();
                }
                else  //如果没有空闲线程
                {
                    if (!this.isFullLoad)//如果当前管理器还未满负载
                    {
                        threadEntity = new QYThreadEntity();
                        threadEntity.init();
                        this.runningThreadCount++;
                    }
                }
            }

            return(threadEntity);
        }
Пример #3
0
        /// <summary>
        /// 执行线程池工作
        /// </summary>
        public void DoWork()
        {
            QYThreadEntity entity = null;
            Action         task   = null;

            lock (this.lockObj){
                //每次仅仅提取一个任务出来,有多个任务时,等待下次循环再获取
                //避免某个线程池任务堆满了管理器中的可用名额,使得其他线程池无法尽快得到执行的权限这种情况
                if (this.taskList.Count > 0)
                {
                    entity = this.manager.RequestThread();
                    if (entity != null)
                    {
                        //提取出第一个
                        task = this.taskList.First.Value;
                        this.taskList.RemoveFirst();

                        //累加计数器
                        this.runningThreadCount++;

                        //执行任务
                        entity.execute(task, () => {
                            lock (this.lockObj){
                                //回收线程资源
                                this.manager.StoreThread(entity);

                                //回收一个计数器
                                this.runningThreadCount--;
                            }

                            //通知有任务变化
                            this.manager.NotifyWork();
                        });
                    }
                }
            }
        }