• Logger 源码解析 MyLogger


    public MyLogger(String logFileName, int interval){
            super();
            this.logFileName = logFileName;
            this.logInterval = interval;
            this.stopFlag =true;
        }

    MyLogger 是最基础的一个类, 包括两个参数和, 一个是 logFileName,用于记录将数据记录到哪个文件中,显然,文件的定义应该在各个子类中。

    另一个是 logInterval, 用于确定记录的精度。 最后一个是 stopFlag, 目前还不知是干嘛的

    public void startLog()
    	{
    		this.start();
    	}
    public void stopLog()
    	{
    		this.stopFlag = false;
    	}
    

     startLog() 是对 start() 的重写, 直接调用即可完成操作, 我依稀记得 start() 是自动启动的, 并且会调用 run 函数

     每次 RUN 的时候还要监听 stopFlag 的值, 代价是否有些高?

     stopLog() 仅是对 stopFlag 的更改, 应该是与某个函数混合使用 (自然是放在 RUN 内)

     写道这里,我似乎有些明白 stopFlag 的原因了, 开启 myLogger 的某个子类时, myLogger 线程就会启动, 但是关闭其中之一个子类, 却不会使整个线程被关掉。 这样说也不合逻辑, 毕竟每个子类都应该有自己对应的线程, 自己关自己的, 也没问题嘛

    public abstract String getLogValue();

      这个不是太了解其具体的操作

    this.stopFlag = true;
    BufferedWriter out = new BufferedWriter(new FileWriter(this.logFileName));
    SimpleDateFormat bartDateFormat =  
    new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss.SSS");  
    int count = 0;

    这段代码 建立了一个输入连接,为了是将数据写入 txt 中。 时间的格式, 是为了给要写入的数据加上一个 tag

    ? 不过这个频率是不是有点太低了, 仅具体到秒而已

    if(count++ == FLUSH_COUNT)
        {
            out.write(log);
            out.flush();
            log = "";
            count = 0;
        }
    Thread.sleep(this.logInterval);    

    这边的设计比较巧妙, 每隔 FLUSH_COUNT flush 一次, 效率比较高

     在 RUN 的最后, 和我想到一样, 有一个对 stopFlag 的判断

    if(!stopFlag)
                {
                    out.write(log);
                    out.flush();
                    out.close();
                }

    并且, 每次 run 的时候, 都会将 stopFlag 设为 true.

    那么, 会不会出现一个 bug呢,即, 记录 WIFI 和 CPU 的线程在跑的时候, 共享一个 Stopflag? 以致于无法停止?

    看 RUN 函数其他部分

        Thread.sleep(this.logInterval);    
           long timeInMillis = System.currentTimeMillis(); // 获得当前时间的毫秒树, 自 1970年至今   
           Calendar cal = Calendar.getInstance();      // 使用默认地区和制定语言获得的日期实力
           cal.setTimeInMillis(timeInMillis);              // 时间的转换
           Date date = cal.getTime();             // 将 cal 记录的时间转到 Date 中
           log+=bartDateFormat.format(date)+"\t"+ this.getLogValue() + "\r\n";  //将 date 的时间以某种格式显示出来

    JAVA 对时间的获取还真是麻烦呢

      

     MyLogger 类大致就是这个样子的

    总结一下

      MyLogger 是所有记录类的父类, 其有三个个参数, 分别为: filename, interval, stopFlag

      分别用于记录存放日志的文件, 采集数据的频率。 至于 stopFlag, 我一直觉得不妥,是不是当作一个参数更好一些, 或者把 stopFlag 作为一个类, 以防止多线程中共享变量的冲突问题

      不过话说回来, 第一,继承 Thread 的类是无法进行参数共享的。 第二,也没有带参数的 run 方法

      这么说来, 使用 stopFlag 也是一个必然了

      另外, 还有一个抽象的方法 getValue() 

        public abstract String getLogValue();

      这个方法在子类中实现

     最后附上源代码:

      https://github.com/Haofu-Han-973/Logger

  • 相关阅读:
    Windows Phone 7 Coding4Fun的弹出框来源:http://www.cnblogs.com/majian714/archive/2011/12/02/2272060.html
    jsp连接mysql的增删改操作
    各种数据库的比较
    jsp连接mysqlupdata操作
    jsp连接Mysql关键代码
    Duwamish学习笔记
    值类型和引用类型的区别
    Factory Method模式的学习
    实现事务的几种方法
    提高Dotnet应用程序性能的技巧
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3087816.html
Copyright © 2020-2023  润新知