项目目标

统计磁盘某个文件目录下子目录、子文件所占空间的大小
通过曲线图实时展示 CPU 占有率
掌握多线程编程技术
深入理解树的遍历方法

项目使用技术栈或平台

所用技术:javaSE/javafx
平台与环境:windows 10/jdk1.8/idea

项目功能

显示 CPU 占有率
文件目录扫描

项目演示


项目分模块讲解思路

项目总体模块框图
创建主程序
fxml 描述 UI
CPU 占有率 Tab 页设计
磁盘扫描 Tab 页设计
Controller 模块
系统资源获取模块
文件目录扫描模块

项目总体模块框图

OS Monitor 项目结构分为两部分:UI 部分逻辑部分
UI 部分包括:主程序、磁盘空间扫描 Tab 页、CPU 占有率 Tab 页、Controller。UI 部分是通过 javafx 来实现。
逻辑部分包括:系统资源获取、文件目录扫描。系统资源是通过OperatingSystemMXBean 来获取。

javafx

javaFX 是 JAVA 的 GUI 工具箱(GUI 是图形用户界面的缩写),用 JavaFX 创建桌面应用程序和游戏非常容易。

javaFX 已经取代了 Swing 成为 Java 推荐的 GUI 工具包。此外,JavaFX在设计上比 Swing 更一致,并 且具有更多功能。它也更现代,使您能够使用布局文件(XML)设计 GUI 并使用 CSS 设置样式,就像 我们习惯于 Web 应用程序一样。 JavaFX 还将 2D 和 3D 图形、图表,以及音频、视频和嵌入式Web应 用程序集成到一个一致的GUI工具包中。

Gluon 公司已经将 JavaFX 移植到了 Android 和 iOS 上运行。 javafx 的核心构架:

intel 系列 CPU 及其架构

CPU的起源可以一直追溯到1971年。在那一年,当时还处在起步阶段的Intel公司推出了世界上第一颗微处理器4004。这不但是第一个用于计算器的4位微处理器,也是第一款个人有能力买得起的电脑处理器!

Intel 8008 为世界上第一款八位元处理器。8008共推出两种速度,0.5 Mhz 以及 0.8 Mhz,虽然比 4004 的工作时慢,不过因为是八位元处理器(比起4004的四位元),整体效能要比4004好上许多。8008 可以支援到 16KB 的内存。Intel 8080 指令执行速度是8008的10倍。8080可寻址的范围(64KB)是8008(16KB)的4倍,这些改进导致进入了8080时代,并且使微处理器继续繁荣昌盛。Intel 8085 的主频,它低主频3 MHz,高主频也不过6MHz。当年使用此CPU的厂商非常多, 包括了AMD,TOSHIBA,FUJI,SIEMENS等等。

Intel 8086,Intel 公司在 1978 年首次生产出 16 位微处理器,并命名为 i8086。毫无疑问,8086是 在我们曾经的计算机课本中出现频率高的一个型号。

1982年,Intel 推出了划时代的新产品 80286 芯片,该芯片比 8086 和 8088 都有了飞跃的发展,虽然它仍旧是16位结构,但是在CPU的内部含有13.4万个晶体管,时钟频率由初的6MHz逐步提高到20MHz。其内部和外部数据总线皆为16位,地址总线24位。与 8086 相比,80286 寻址能力达到 了16MB,可以使用外存储设备模拟大量存储空间,从而大大扩展了80286的工作范围,还能通过多任务硬件机构使处理器在各种任务间来回快速切换,以同时运行多个任务,其速度比 8086 提高了5倍甚至 更多。从80286开始,CPU的工作方式也演变出两种来:实模式和保护模式。

1985 年, Intel 推出了80386 芯片,它是 80x86 系列中的第一种 32 位微处理器,而且制造工艺也有了很大的进步。与80286相比,80386内部内含27.5万个晶体管,时钟频率为12.5MHz,后逐步提高到20MHz、25MHz、33MHz。80386的内部和外部数据总线都是32位,地址总线也是32位,可寻址高达4GB内存。同时也是第一种具有“多任务 ”功能的处理器——这对微软的操作系统发展有着重要的影响,所谓“多任务”就是说处理器可以在同时处理几个程序的指令。1989年,Intel 推出 80486 芯片由,这种芯片的伟大之处就在于它实破了100 万个晶体管的界限, 集成了120万个晶体管。80486的时钟频率从25MHz逐步提高到33MHz、50MHz。80486是将80386和数学协处理器80387以及一个8KB的高速缓存集成在一个芯片内,并且在80x86系列中首次采用了 RISC(精简指令集)技术,可以在一个时钟周期内执行一条指令。它还采用了突发总线方式,大大提高 了与内存的数据交换速度。

1999年英特尔发布了Pentium III处理器。从Pentium III开始,英特尔又引入了 70 条新指令 (SIMD,SSE),主要用于因特网流媒体扩展(提升网络演示多媒体流、图像的性能)、3D、流式音频、视频和语音识别功能的提升。Pentium III 可以使用户有机会在网络上享受到高质量的影片,并以 3D的形式参观在线博物馆、商店等,Pentium III 处理器集成了950万个晶体管,并且是首个使用0.26微米技术的微处理器。Pentium III处理器也发生过错误的事故,可能使用户储存的数据出错,但是英特尔处理这类问题的措施已经炉火纯青,所以只是帮助部分受影响的客户更换主板或者更新微码就解决了该问题。但是另外一个更严重的事情是:英特尔在Pentium III开始引入了硬件序列号功能,每一片 Pentium III处理器都有独特的硬件序列号,这样就有可能区分出具体的某台电脑特征。不过很遗憾的是,世界上大多数人都对这个新特性非常不满;尤其是隐私保护团体不断游说,要求取消这个功能。这样,英特尔公司也作出了妥协,允许在硬件设置中关闭该功能,终在处理器内部取消了这个功能收 场。同样,Pentium III也有对应型号的 Celeron 处理器,来应对低端市场。 2000 年英特尔发布了Pentium 4 处理器,自此 Intel 来到了一个一统江湖的时代。基于Pentium 4 处理器的个人电脑,可以让用户创建专业品质的影片,透过因特网传递电视品质的影像,并进行实时语 音、影像通讯,实时3D渲染,快速进行MP3编码解码运算,在连接因特网时运行多个多媒体软件。

2001年英特尔安腾(Itanium)处理器 英特尔安腾处理器是英特尔推出的64位处理器家族中的首款产品。该处理器是在基于英特尔简明并行指令计算(EPIC)设计技术的全新架构之基础上开发制造的,设计用于高端、企业级服务器和工作站。该处理器能够为要求苛刻的企业和高性能计算应用(包括电子商务安全交易、大型数据库、计算机辅助的机械工程以及精密的科学和工程计算)提供全球出色的性能。

2002年:英特尔安腾2处理器(Itanium2) Intel Pentium 4 /Hyper Threading处理器

英特尔安腾2处理器是安腾处理器家族的第二位成员,同样是一款企业用处理器。该处理器家族为数据密集程度高、业务关键和技术要求高的计算应用提供英特尔架构的出色性能及规模经济等优势。该处理器能为数据库、计算机辅助工程、网上交易安全等提供领先的性能。2003年英特尔奔腾 M(Pentium M) /赛扬 M (Celeron M)处理器 英特尔奔腾M处理器,英特尔855芯片组家族以及英特尔PRO/无线2100网卡是英特尔迅驰? 移动计算技术的三大组成部分。英特尔迅驰移动计算技术专门设计用于便携式计算,具有内建的无线局域网能力和突破性的创新移动性能。该处理器支持更耐久的电池使用时间,以及更轻更薄的笔记本电脑造形。

2005年Intel Pentium D 处理器首颗内含2个处理核心的Intel Pentium D处理器登场,正式揭开x86处理器多核心时代。(绰号胶水 双核,被别人这样叫是有原因的,PD由于高频低能噪音大,所以才有这个称号)

2005年:Intel Core处理器 这是英特尔向酷睿架构迈进的第一步。但是,酷睿处理器并没有采用酷睿架构,而是介于NetBurst 和Core之间(第一个基于Core架构的处理器是酷睿2)。初酷睿处理器是面向移动平台的,它是英特 尔迅驰3的一个模块,但是后来苹果转向英特尔平台后推出的台式机就是采用的酷睿处理器。酷睿使双 核技术在移动平台上第一次得到实现。与后来的酷睿2类似,酷睿仍然有数个版本:Duo双核版,Solo 单核版。其中还有数个低电压版型号以满足对节电要求苛刻的用户的要求。

2006年:(酷睿2,俗称“”)/ 赛扬 Duo 处理器
Core微架构桌面/移动处理器:桌面处理器核心代号Conroe。将命名为Core 2 Duo/Extreme家族,其E6700 2.6GHz型号比先前推出之强的Intel Pentium D 960(3.6GHz)处理器,在效能方面提升了40%,省电效率亦增加40%,Core 2 Duo处理器内含2.91亿个晶体管。移动处理器核心代号 Merom。是迅驰3.5和迅驰4的处理器模块。当然这两种酷睿2有区别,主要的就是将FSB由 667MHz/533MHz提升到了800MHz。 2007年:Intel 四核心服务器用处理器 英特尔已经推出了若干四核台式机芯片,作为其双核Quad和Extreme家族的组成部分。在服务器 领域,英特尔将在其低电压3500和7300系列中交付使用不少于具有9个四核处理器的Xeons。
比特科技

2007年:Intel QX9770四核至强45nm处理器 先进制程带来的节能冷静,HI-K的引进使CPU更加稳定。先进的SSE4.1指令集、快速除法器,卓越 的执行效率,INTEL在处理器方面不断领先

2008年:Intel Atom凌动处理器 低至0.6W的超低功耗处理器,带给大家的是难以想象的节能与冷静

2008年11月17日:Intel发布core i7处理器 2009-2010分别推出之后 i5,i3 系列,至此Intel 家族 core 系列发布完毕

创建工程

打开IDEA,选择菜单新建 project.

创建主程序

将项目自动生成的主程序替换成我们的 OSMonitorApplication

// 所有 javafx 主程序必须派生自 Application 类
// 子类必须 override 父类的 start 方法
public class OSMonitorApplication extends Application {@Override    public void start(Stage primaryStage) throws Exception {        // 1. 加载 .fxml 文件        FXMLLoader loader = new  FXMLLoader(getClass().getClassLoader().getResource("os_monitor_tab1.fxml")); Parent root = loader.load();// 2. 创建一个场景对象                Scene scene = new Scene(root, 800, 600);        // 3. 给舞台对象设置标题        primaryStage.setTitle("OS Monitor");        // 4. 给舞台对象 stage 设置场景对象 scene          primaryStage.setScene(scene);       // 5. 展示舞台        primaryStage.show();    } }

fxml 描述 UI

我们要用自己设计的 UI 替换工程自动生成的 .fxml 文件。

UI 的主题框架是通过 fxml 来描述。UI 交互比较简单,只有两个 tab 页。fxml 中所有元素名称都是 javafx 中的类名或者是类的属性名。元素的属性是 javafx 中类的属性。

OS Monitor UI 主框架包含两个 tab 页,用到的控件是 和 。 代表 tab 页所在的容器面板, 代表一个个的 tab 页。

<?xml version="1.0" encoding="UTF-8"?>
// 导入类路径
<?import javafx.geometry.Insets?><VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.171"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.haska.ui.OSMonitorController">   <children>      <TabPane tabClosingPolicy="UNAVAILABLE">         <tabs>            <Tab onSelectionChanged="#handleCPUSelectionChanged" text="CPU 占有 率">               <content>                 ...               </content>           </Tab>            <Tab text="磁盘空间统计">              <content>                ...               </content>            </Tab>         </tabs>      </TabPane>   </children>
</VBox>

CPU 占有率 Tab 页设计

CPU 占有率 = CPU 执行程序时间 / 统计周期时间。比如,每 100ms 统计一次占用率,如果 CPU 执行 程序用了 90ms,那么 CPU 占用率是 90/100 = 90%。CPU 执行程序时间包括:用户程序执行时间 和 内核空间执行时间。

CPU 占有率 Tab 页主要是通过 控件绘制曲线图,x 轴 和 y 轴都用 控 件。通过 控件的 onSelectionChanged 属性设置监听事件的方法:
handleCPUSelectionChanged。

<LineChart fx:id="cpuChart" animated="false" HBox.hgrow="ALWAYS">   <xAxis>       <NumberAxis animated="false" label="Seconds" side="BOTTOM" />   </xAxis>   <yAxis>       <NumberAxis animated="false" label="Percent" side="LEFT" />   </yAxis>
</LineChart>

磁盘扫描 Tab 页设计

磁盘扫描 Tab 页主要是用到了 控件,绘制一个树形表格。另外设计了一个 控件来选择文件目录,通 控件的 onAction 属性设置监听事件的方法: handleSelectFile。

<Label text="选择文件目录:"></Label>
<Button mnemonicParsing="false" onAction="#handleSelectFile" prefWidth="80.0" text="选择" GridPane.columnIndex="1">   <GridPane.margin>      <Insets bottom="5.0" top="5.0" />   </GridPane.margin>
</Button><TreeTableView fx:id="fileStat" HBox.hgrow="ALWAYS">   <columns>      <TreeTableColumn prefWidth="75.0" text="目录名">          <cellValueFactory>             <TreeItemPropertyValueFactory property="fileName" />          </cellValueFactory>      </TreeTableColumn>      <TreeTableColumn prefWidth="75.0" text="总长度">           <cellValueFactory>             <TreeItemPropertyValueFactory property="totalLength" />           </cellValueFactory>      </TreeTableColumn>  </columns>
</TreeTableView>

Controller 模块

Controller 主要是用于处理 UI 事件,需要将此类添加到 .fxml 文件中,我们用到的顶级容器是 ,通过 fx:controller 属性设置 Controller 类的包路径,方法如下:

<VBox maxHeight="-Infinity" maxWidth="-Infinity"
minHeight="-Infinity" minWidth="-Infinity"
xmlns="http://javafx.com/javafx/8.0.171"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.haska.ui.OSMonitorController">
</VBox>

在 Controller 中,我们需要处理两个事件:CPU占有率和目录结构统计,代码如下:

// 磁盘目录扫描事件处理方法
public void handleSelectFile(ActionEvent actionEvent) {    // 1. 打开文件选择对话框    // 2. 开启磁盘目录扫描线程    // 3. 渲染TreeTableView
}
// CPU 占有率事件处理方法
public void handleCPUSelectionChanged(Event event) {    // 1. 创建一个定时器,每隔一秒获取一次 CPU 资源绘制曲线图    // 2. 绘制 LineChart
}

系统资源获取模块

系统资源获取采用的是 OperatingSystemMXBean,这是一个 JMX 接口,用于获取运行 JVM 的系统的 资源信息,比如,CPU 占有率,OS 版本,内存大小等等。我们用的是 com.sun.management.OperatingSystemMXBean 类,接口比较简单,参考官方文档即可。 绘制 CPU 占有率曲线的核心思想:
1. 每隔一秒对 CPU 占有率进行一次采样,作为数轴的 y 坐标。
2. 我们一共保存 60 秒,即 1 分钟的样本点,时间作为 x 坐标。
3. 用一个数组保存坐标 (x,y),每一次采样,需要把之前采样的坐标点的 x 坐标减 1,这样绘制的时候 就会产生移动的效果。
核心代码:

private static final int DATA_LENGH = 60;
private static XYPair[] cpuDatas = new XYPair[DATA_LENGH];
private static int firstIndex = DATA_LENGH;private static void moveCPUData(double cpuPercetage){        int movIdx = -1;        if (firstIndex == 0){            movIdx = firstIndex + 1;        }else {            movIdx = firstIndex;            firstIndex--;        }for (; movIdx < cpuDatas.length; ++movIdx){            cpuDatas[movIdx-1].setX(cpuDatas[movIdx].getX()-1);                    cpuDatas[movIdx-1].setY(cpuDatas[movIdx].getY());        }movIdx--;cpuDatas[movIdx] = new XYPair(movIdx, cpuPercetage); }

文件目录扫描模块

文件目录扫描比较简单,核心思想是:用递归的方式遍历文件目录结构,统计某个目录下面所有子目录 占用总的磁盘空间大小,然后再做一个汇总。
代码片段:

File[] files = node.getFile().listFiles();
if (files == null) {    return;
}for (File file : files) {   FileTreeNode child = new FileTreeNode();   child.setFile(file);   child.setFileName(file.getName());if (file.isDirectory()) {        scannerDirectory(child);   } else {        t Tchild.setTotalLength(file.length());   }   node.setTotalLength(node.getTotalLength() + child.getTotalLength());  node.addChildNode(child);
}

项目总结

  • 项目优点:引入了 javafx 技术,通过图形化 界面展示 CPU 占有率和磁盘空间统计,显得更直观。
  • 项目缺点:项目的所实现的功能相对简单,UI 不够美观。
  • 项目扩展:我们还能将该项目写的更完善,可以往以下几个发展方向走:
    1. 增加关于内存使用情况的统计
    2. 增加关于网络上下行带宽的统计
    3. 可以美化一下 UI

常见项目面试题

  • 你为什么要做这个项目?
  • 你的项目有什么缺点?
  • 你的项目参考了什么项目?
  • 如何控制 CPU 占有率曲线为正弦波?
Runnable r = () -> {      double radix = 2.0;      int i = 0;      for (; ; ) {           double runtime = 100 + Math.sin((Math.PI * i++) / radix) * 100;           long startTime = System.currentTimeMillis();while (System.currentTimeMillis() - startTime < runtime) ;try {                   Thread.sleep(200 - (long) runtime);           } catch (InterruptedException e) {                    e.printStackTrace();           }       }
};
// CPU core 个数,可以通过 OperatingSystemMXBean 获取
for (int k = 0; k < 4; ++k){    Thread t = new Thread(r);    t.start();
}
try {     Thread.sleep(3600*1000);
} catch (InterruptedException e) {     e.printStackTrace();
}

OS monitor 项目相关推荐

  1. mac os qt项目编译_【Qt开发】第一个Qt程序Hello World!

    一:说在前头 我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级,冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗位 ...

  2. MAC OS上将项目提交到github

    1.在github上创建一个repository用来存放你将提交的项目 2.打开终端进入你项目的根目录执行以下命令 git init git add. git commit -m 'initial' ...

  3. OS开源项目周报0105

    由OpenDigg 出品的iOS开源项目周报第四期来啦.iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. Hero  ...

  4. Chromium OS 开源项目

    基于chrom浏览器的开源开发 http://www.chromium.org/chromium-os

  5. ADRV9009 与 zcu102搭建ADI的no os项目

    近期忙完手头的活,难得有时间继续研究一下自己感兴趣的事情.一直想着把上半年项目采购的一套软件无线电的平台搭建起来(ZCU102+ADRV909),近期做了几个实验,就把自己做的一点进展与大家分享.希望 ...

  6. 操作系统-ucore-lab1 Bootloader启动操作系统 A20 GDT全局描述符 使能和进入保护模式 ELF格式os 8259A中断控制器 8253定时器 函数调用堆栈跟踪函数

    操作系统-ucore-lab1 本文详细地址 实验一:系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm(修改了名字,以便于彩色显示)a. 开启 ...

  7. 2015 年 Git@OSC 新增热门开源软件项目 Top 50

    在刚刚过去的 2015 年里,Git@OSC 取得了巨大的发展,收录了大量热门优秀作品.与<2015 年 Git@OSC 最热门开源项目 Top 50>一样,此榜单仍然是通过 Watch. ...

  8. 华为鸿蒙OS 2.0正式发布!明年华为手机将全面支持!

    全世界只有3.14 % 的人关注了 爆炸吧知识 9 月 10 日,在华为开发者大会 2020 上,华为消费者业务 CEO 余承东宣布推出鸿蒙 OS 2.0 版本(HarmonyOS 2.0).鸿蒙 O ...

  9. LinkedIn 详细介绍了他们开源的 Kafka Monitor

    在2016年4月份举行的Kafka峰会上,LinkedIn在Apache 2.0许可协议下开源了Kafka Monitor,并于近日详细介绍了该监控工具的架构以及他们最初的构建动机.在年初的时候,Li ...

  10. Mac OS开发—Xcode给Mac应用添加编辑快捷键(剪切 复制 粘贴 全选 删除 撤销 重做)功能

    前言 笔者做Windows开发的,无奈公司有Mac OS的项目需要维护,之前没有编辑菜单的功能,需要笔者加上这个功能,笔者只能硬着头皮上.还好会c++,Mac应用里面一般都会用object-c 也可以 ...

最新文章

  1. 盘点程序猿经常说的那些行话,你了解吗?
  2. 前端学习(2307):react之props和state
  3. php atlas,apache atlas是什么
  4. 即时通讯推送保障及网络优化详解(一)
  5. 创建此对象的程序是quation_MathType出现此对象创建于Equation中的问题怎么办
  6. 代码评审-如何保证缓存与数据库的读写一致性?
  7. “数学不行,干啥也不行!”CTO:基础差的程序员,你不知道有多难!
  8. java已解密的登录请求_使用https协议解决掉顽固不化的已解密的登录请求
  9. 通俗版 TCP/UDP三次握手 四次握手
  10. node解决request返回内容gzip乱码问题
  11. python中导入模块的方式_在python中导入模块中的对象有哪几种方式
  12. 如何编写系统设计说明书
  13. 年薪60w的程序员与年薪6w的极品程序员,差距怎么这么大呢?
  14. Windows2016 主从CA(一、企业根CA与独立从CA)
  15. Linux服务器间传文件SCP命令使用方法
  16. UI设计师=美工?不同是人眼里UI设计师~
  17. thinkDifferent思维糖果
  18. 使用SQL的灵魂(精华)
  19. 《吴军信息论40讲》学习笔记(完)
  20. 矢量量化识别孤立字的matlab编码_新zwpython 完胜 老matlab 篇二

热门文章

  1. 创建局域网Git服务器
  2. 基因重组-冲刺日志(第九天)
  3. 51单片机游戏(推箱子)
  4. chrome首页被hao123篡改 解决方法
  5. win7系统怎么安装dhcp服务器,笔者研习win7系统安装dhcp服务器的技巧介绍
  6. 为什么没有黑客攻击棋牌游戏
  7. 使用 Python 制作黑白照片生成器
  8. 给自己定个一年后的终极目标!
  9. 实现收藏本站和设为首页功能
  10. 基于ssm+vue+elementui的的ktv点歌管理系统