zoukankan      html  css  js  c++  java
  • 智能预判 (二:最初的布局)

    不太会画图,先简单看下 程序流程,他比 其他 服务器 多了 一个 单独的 线程 内部数据库 物理运算,也就是  他的运算 不需要 客户端  时时给信息。

    下面是 片段代码。

                var bootstrap = BootstrapFactory.CreateBootstrap();
    
                if (!bootstrap.Initialize())
                {
                    Console.WriteLine("无法初始化");
                    Console.ReadKey();
                    return;
                }
    
                var result = bootstrap.Start();
    
                Console.WriteLine("服务器启动: {0}!", result);
    
                if (result == StartResult.Failed)
                {
                    Console.WriteLine("无法启动");
                    Console.ReadKey();
                    return;
                }
    
                Console.WriteLine("线程池开启!");
    
                ThreadPoolMain.OnStartThreadPool();
    

      

            public static void OnStartThreadPool()
            {
                cs = "server=127.0.0.1;database=playgame;user=sa;pwd=zzjzzj888;pooling=true;min pool size=10;max pool size=10000";
                OnSqlHelper = new SqlHelper(cs);
    
                //新建ManualResetEvent对象并且初始化为无信号状态
                ManualResetEvent eventX = new ManualResetEvent(false);
                ThreadPool.SetMaxThreads(12, 12); //线程池  
                ThreadQueue Queue = new ThreadQueue();
    
    
                while (OnReadSql()>0)
                {
                    Console.WriteLine("结束并修改数据库!!");
                    Queue.QueueWorkItem(eventX, taskcount);//分配任务
                    eventX = new ManualResetEvent(false);  
                } 
            }
    
            static int taskcount;
            //读取数据库,如果没符合条件 等待后继续读取
            static int OnReadSql()
            {
                // 读取数据库数据,拿到最新的 当前时间点 之内  的数据。
                //排序这列数据。
                taskcount = sqls();//任务数量 
                if (taskcount == 0)
                {
                    Thread.Sleep(11);//如果没有数据,则2秒钟后继续寻找
                    OnReadSql();
                }
                return taskcount;
            }
            public bool QueueWorkItem(ManualResetEvent eventX, int task)
            {
                Console.WriteLine("主线程运行开始");
                Thread.Sleep(1000);
                ThreadProcClass t = new ThreadProcClass(task, eventX);
                for (int i = 0; i < task; i++)
                {
                    JsonData json = new JsonData();
                    json["name"] = "zzj" + i;
                    json["message"] = "ok" + i;
                    ThreadPool.QueueUserWorkItem(new WaitCallback(t.ThreadProc), new SomeState(json));
                }
                //等待事件的完成,即线程调用ManualResetEvent.Set()方法
                //eventX.WaitOne  阻止当前线程,直到当前 WaitHandle 收到信号为止。 
                eventX.WaitOne(Timeout.Infinite, true);
                return true;
            }
            public ThreadProcClass(int count, ManualResetEvent mre)
            {
                iMaxCount = count;
                eventX = mre;
            }
    
            public static int iCount = 0;
            public static int iMaxCount = 0;
            public ManualResetEvent eventX;
            public void ThreadProc(object i)
            {
                Console.WriteLine("Thread " + ((SomeState)i).json.ToJson());
                Thread.Sleep(1111);
                //Interlocked.Increment()操作是一个原子操作,作用是:iCount++ 具体请看下面说明 
                //原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。
                //由于操作系统大部分时间处于开中断状态,
                //所以,一个程序在执行的时候可能被优先级更高的线程中断。
                //而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。
                //就是不能被中断的操作。
                Interlocked.Increment(ref iCount);
                if (iCount == iMaxCount)
                {
                    //   Console.WriteLine("最后一个子线程发出结束信号!");
                    //将事件状态设置为终止状态,允许一个或多个等待线程继续。
                    iCount = 0;
                    eventX.Set();
                }
            }
  • 相关阅读:
    [Golang学习笔记] 06 程序实体3 类型断言和类型转换
    [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
    [Golang学习笔记] 04 程序实体1 变量声明
    [Golang学习笔记] 03 库源码文件
    virgo-tomcat-server的生产环境线上配置与管理
    virgo-tomcat-server最大并发连接数的修改
    linux系统下kvm虚拟机的安装
    关于virgo-tomcat-server-3.6.0.RELEASE配置文件修改说明
    关于在Linux下apache-maven的安装
    H3C系列之三层交换机文件管理
  • 原文地址:https://www.cnblogs.com/big-zhou/p/5463435.html
Copyright © 2011-2022 走看看