96 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
| 
								 | 
							
								using System.Threading;
							 | 
						||
| 
								 | 
							
								using base_kcp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace dotNetty_kcp.thread
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public abstract class AbstratcMessageExecutor:IMessageExecutor
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        private Thread _thread;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private volatile bool shutdown;
							 | 
						||
| 
								 | 
							
								        private volatile bool close;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private readonly object _gate = new object();
							 | 
						||
| 
								 | 
							
								        private static int id;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /**
							 | 
						||
| 
								 | 
							
								 * 启动消息处理器
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								        public virtual void start()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            _thread = new Thread(run) {Name = "ThreadMessageExecutor-" + id++};
							 | 
						||
| 
								 | 
							
								            _thread.Start();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /****
							 | 
						||
| 
								 | 
							
								         *
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        public void stop(bool stopImmediately)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (shutdown)
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            shutdown = true;
							 | 
						||
| 
								 | 
							
								            if (stopImmediately)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                close = true;
							 | 
						||
| 
								 | 
							
								                lock (_gate)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Monitor.Pulse(_gate);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            while (!isEmpty())
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Thread.Sleep(1);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            close = true;
							 | 
						||
| 
								 | 
							
								            lock (_gate)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Monitor.Pulse(_gate);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public abstract bool isFull();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected abstract bool isEmpty();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected abstract bool TryDequeue(out ITask task);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected abstract bool TryEnqueue( ITask task);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private void run()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            while (!close)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (TryDequeue(out var task))
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    task.execute();
							 | 
						||
| 
								 | 
							
								                    continue;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                lock (_gate)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Monitor.Wait(_gate);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public bool execute(ITask iTask)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (shutdown)
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            bool result = TryEnqueue(iTask);
							 | 
						||
| 
								 | 
							
								            lock (_gate)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Monitor.Pulse(_gate);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return result;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |