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;
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
} |