自己最近写的一组日志处理类(线程调度优化)

原创 2012年04月01日 08:18:28

前面分享的一篇文章<<自己最近写的一组日志处理类(支持高并发处理)>>里写了一个多线程的写日志的类,当时测试的时候没有太注意,后面发现这个日志类占用cpu太厉害,经过调试发现问题出在对于线程的挂起(Suspend)和唤醒(Resume)上面(这两个方法已经在新的框架里里面被废掉了).我调用这两个方法的目的就是在没有日志写的时候,线程不要再运行,等待有需要写日志的时候再继续工作.后面改了一种方式来实现这个目的,CPU占用问题就解决了,当然下面的这种方式也是对线程挂起和唤醒的一种新的替代方式,下面是修改后的代码,注释很详细,原来的代码大家请参考前面的博文:

 /// <summary>
        /// 定义一个信号变量,采用的是ManualResetEvent
        /// </summary>
        private ManualResetEvent resumeEvent = new ManualResetEvent(false);

        /// <summary>
        /// 定义一个变量,用于记录线程是否处在pause状态.
        /// </summary>
        private volatile bool FPaused = false;
        /// <summary>
        /// 线程挂起
        /// </summary>
        public void Pause()
        {
            //如果当前线程不处在挂起状态就进行挂起操作
            if (FPaused == false)
            {
                FPaused = true;
                //重新设置信号量为初始状态
                resumeEvent.Reset();
                //进行线程等待.
                resumeEvent.WaitOne();
            }
        }
        /// <summary>
        /// 唤醒线程并继续执行
        /// </summary>
        public void Resume()
        {
            //如果在运行就不进行唤醒操作
            if (FPaused == true)
            {
                FPaused = false;
                //唤醒所有等待线程,本例中等待的只有当前写线程(因此也可以用AutoResetEvent来实现).
                resumeEvent.Set();
            }
        }

        private void WriteLogToFile()
        {

            while (FStop==false)
            {
                try
                {
                    //_streamWriter.Flush();
                    //Thread.Sleep(10000);
                    string theLogContent = null;
                    //队列操作时需要锁定,否则会报错.队列并不是线程安全的.
                    //但多个队列可以同时写.

                    lock (this)
                    {
                        theLogContent = _logCaches.Dequeue();
                    }
                    if (theLogContent != null && theLogContent != "")
                    {
                        _streamWriter.WriteLine(DateTime.Now.ToString() + ": " + theLogContent);
                        _streamWriter.Flush();
                        LastExecTime = DateTime.Now;
                    }
                    //修改调整处
                    //如果日志缓冲区为空,则挂起当前线程.
                    if (_logCaches.Count <= 0)
                    {
                        
                        this.Pause();
                        
                    }
                }
                catch (Exception ex)
                {
                    SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error);
                }

            }
        }


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA程序设计(18.1)----- 1多线程轮流打印 线程调度 线程池 synchronized wait notify 内部类

1.两个线程 一个打印A 一个打印B 另两个线程轮流进行打印工作 多线程初级应用 线程调度  线程池(预先建立N个线程,需要的程序直接调用,执行完毕后归还回线程池,典型的以空间换时间 synchron...
  • Anubies
  • Anubies
  • 2014年11月23日 02:09
  • 1096

【Java基础之Object类(二)、线程同步(一)】Java中使用Object类的wait,notify,notifyAll做线程调度

我们知道java中的所有类的祖先都是Object,Object类有四个个方法wait(),wait(long timeout),notify(),notifyAll(),这四个方法可以用来做线程的调度...

【Java基础总结】-了解Java线程调度、并发安全及锁优化

Java内存模型Java虚拟机提供的同步机制 synchronized关键字 java.util.concurrent包 volatile关键字 (最轻量级的同步机制) 对于volatile型变量的特...

java多线程Thread-线程调度类CountDownLatch计数器

背景 说起Java,不得不说到他在线程上的优越性,由于封装好了,对于使用者是大大的提升了可读性和理解性。正好我也想记录下关于多线程的基本用法。相关知识 说到多线程,讲讲它的含义,首先,进程就是正在运行...

Android流畅性优化必备基础知识点---线程调度方式

线程调度  编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 计算机通常只有一个CPU,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才...

操作系统课程设计线程调度

  • 2011年12月15日 15:58
  • 1.44MB
  • 下载

线程调度的优先级

  • 2012年05月17日 16:59
  • 14KB
  • 下载

我之见--线程调度基本知识

之前我们已经学习过了,线程的一

模拟线程调度

  • 2016年11月22日 11:21
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己最近写的一组日志处理类(线程调度优化)
举报原因:
原因补充:

(最多只允许输入30个字)