Java Basic3(泛型、Muti-Processing、JMX、Stand Mbean、Dynamic Mbean)
一、泛型
Java1.5后支持。
注:C++中有Template,是真正的泛型,但是会导致类膨胀;Java为伪泛型,编译时自动解析为原类型,也叫类型擦除。
1.Collection
2.Type erasing
-List<long>vs List<String>
3.? 通配符
二、Java Muti-Processing
1.Process
2.ProcessBuilder
3.Standard out/Error output/standard input
- stdin(0),stdout(1),stderr(2)
- Runntime
以下为通过线程调用系统ipconfig /all命令,获取当前主机相关信息
import java.io.InputStreamReader;
import java.io.LineNumberReader;public class RunCommand {public static void main(String[] args) throws Exception{for(int i=0; i<500; i++){run1("ipconfig");run2("ipconfig");System.out.println("i="+i);}}private static void run1(String command) throws Exception{ProcessBuilder pb = new ProcessBuilder(command, "/all");//, "myArg1", "myArg2");//Map<String, String> env = pb.environment();//env.put("VAR1", "myValue");//env.remove("OTHERVAR");//env.put("VAR2", env.get("VAR1") + "suffix");//pb.directory("myDir");Process p = pb.start();p.getErrorStream();InputStreamReader ir = new InputStreamReader(p.getInputStream());LineNumberReader input = new LineNumberReader(ir);String line;while ((line = input.readLine()) != null) {
// System.out.println(line);if (line.indexOf("Host Name . . . . . . . . . . . . : ") != -1) {line = line.substring(line.indexOf(":"));System.out.println("Host Name:" + line);}else if (line.indexOf("Primary Dns Suffix . . . . . . . : ") != -1) {line = line.substring(line.indexOf(":"));System.out.println("domain Name:" + line);}else if (line.indexOf("IPv4 Address. . . . . . . . . . . : ") != -1) {line = line.substring(line.indexOf(":"));System.out.println("IPv4 Address:" + line);}}ir.close();}private static void run2(String command) throws Exception{Process process=Runtime.getRuntime().exec(command);
// InputStreamReader ir = new InputStreamReader(process.getInputStream());
// LineNumberReader input = new LineNumberReader(ir);
// String line;
// while ((line = input.readLine()) != null) {
// System.out.println(line);
// }
// ir.close();}}
三、JMX
1.Concept
https://www.ibm.com/developerworks/cn/java/j-lo-jse63/
Java Management Extension
Java SE 6新特性:JMX与系统管理
(1) 控制台java命令jps可以查看当前运行的java进程
(2) sun.tools.jconsole.JConsole可以查看运行的JVM的各种信息
JConsole算是JMX的一个Client
(3)Java VisualVM监视工具
2.Mbean
采集CPU利用率、调集方法等等,调用信息。
java.lang Memory相当于一个Mbean,其有三大属性Attribute (可读写)、Operations(暴露给别人的一个方法,别人可以去调用它)、Notifications(通知,注册后,如有消息变化,则会主动推送到JMX Client)
四、Stand Mbean
1.Coding convention
-Attribute
-Operations
-Notifications
定义Mbean接口,类结尾必须是MBean;
凡成员变量全都必须有get,set方法:
以下类的作用为:暴露一个Mbean,有属性(C盘磁盘利用率),可读写,也有有参数返回值的操作(查看参数路径下的当前所有文件/目录名),写一个Client在里面进行操作Mbean:
public interface ConfigAlertParamMBean {public String getName();public void setName(String name);public double getDiskUsage();public void setDiskUsage(double diskUsage);public boolean changeAlertThreshold(int thresholdPercent);public void stopAndExit();public List<String> listFiles(String directory); }
实现:
public class ConfigAlertParam implements ConfigAlertParamMBean{private String name; //this is an attributeprivate double diskUsage;private volatile int diskThreshold=80;private volatile boolean stop=false;@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name=name;}@Overridepublic boolean changeAlertThreshold(int thresholdPercent) {this.diskThreshold=thresholdPercent;System.out.println("====set disk usage threshold:" + thresholdPercent );return true;}public boolean isExceedThreshold(int currentDiskUsage){return currentDiskUsage>=diskThreshold;}@Overridepublic void stopAndExit() {stop=true;}public boolean isStopped(){return stop;}@Overridepublic double getDiskUsage() {// TODO Auto-generated method stub
// System.out.println("====set disk usage threshold:" + thresholdPercent );File[] roots = File.listRoots();for (File root : roots) {if (root.getPath().equals("C:\\")) {
// System.out.println("Total space (bytes):" + root.getTotalSpace());
// System.out.println("Usage space (bytes):" + root.getUsableSpace());
// System.out.println((double)root.getUsableSpace()/root.getTotalSpace());diskUsage = (double)root.getUsableSpace()/root.getTotalSpace();} }return diskUsage;}@Overridepublic void setDiskUsage(double diskUsage) {// TODO Auto-generated method stubthis.diskUsage = diskUsage;}@Overridepublic List<String> listFiles(String directory) {// TODO Auto-generated method stubFile dir = new File(directory);File[] files = dir.listFiles();System.out.println(files.length); List<String> fileName = new ArrayList<String>(); ;for (File file : files) { System.out.println(file.getAbsolutePath()); fileName.add(file.getAbsolutePath());}return fileName;}}
2.Register Mbean
-RemoteJMX service vi RMI
public class StartJMXServer {// JVM parameters:// -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false//public static void main(String[] args){ConfigAlertParam bean1=new ConfigAlertParam();bean1.setName("disk usage threshold");MBeanServer mbeanServer=ManagementFactory.getPlatformMBeanServer();try{mbeanServer.registerMBean(bean1,ObjectName.getInstance("config:type=AlertParam"));}catch(Exception ex){ex.printStackTrace();}while(!bean1.isStopped()){int currentDiskUsage=new Random().nextInt(90);boolean exceeded = bean1.isExceedThreshold(currentDiskUsage);if(exceeded){System.out.println("disk usage has exceeded threshold:"+currentDiskUsage);System.out.println("The real disk usage is:" + bean1.getDiskUsage());}try{Thread.sleep(2000L);}catch(Exception ex){ex.printStackTrace();}} System.out.println("jmx sever is stopped");}}
注意在该类Run Configurations的VM arguments中配置参数:
-Dcom.sun.management.jmxremote.port=10000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
3.How to access Mbean from other java process?
(1)可通过JConsole接到Mbean进行查看
(2)创建一个JMXClient客户端查看
public class JMXClient1 {public static void main(String[] args) throws Exception {Map<String, Object> jmxEnv=new HashMap<String, Object>();jmxEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");jmxEnv.put(RMIConnectorServer.JNDI_REBIND_ATTRIBUTE,"true");JMXServiceURL jmxServerUrl=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10000/jmxrmi");JMXConnector connector=JMXConnectorFactory.connect(jmxServerUrl,jmxEnv);MBeanServerConnection conn = connector.getMBeanServerConnection();Object result=conn.invoke(new ObjectName("config:type=AlertParam"), "changeAlertThreshold", new Object[]{ 50 }, new String[]{"int"});//int java.lang.IntegerSystem.out.println(result);System.out.println(conn.getAttribute(new ObjectName("config:type=AlertParam"), "DiskUsage"));List<String> fileName = (List<String>) conn.invoke(new ObjectName("config:type=AlertParam"), "listFiles", new Object[]{ "C:workspace\\demo3\\src\\jmx" }, new String[]{"java.lang.String"});//int java.lang.Integerfor (String file : fileName) { System.out.println(file); }
// conn.getAttribute(hostName, attribute);}}
(3)Remote连接其他电脑的状况设置
五、Dynamic MBean
1.Use scenario
-We can’t change existing code to make some objects
2.Override methods
Java Basic3(泛型、Muti-Processing、JMX、Stand Mbean、Dynamic Mbean)相关推荐
- 从零开始玩转JMX(四)——Apache Commons Modeler Dynamic MBean
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- JMX学习笔记(一)-MBean
JMX学习笔记(一)-MBean 标签: jmxstringjavainterfaceexceptionclass 2010-12-07 22:20 15360人阅读 评论(5) 收藏 举报 分类: ...
- Java通过泛型的模板类型实例化对象
Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...
- 【Java】泛型中 extends 和 super 的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- 聊聊Java的泛型及实现
泛型基础 泛型是对Java语言类型系统的一种扩展,有点类似于C++的模板,可以把类型参数看作是使用参数化类型时指定的类型的一个占位符.引入泛型,是对Java语言一个较大的功能增强,带来了很多的好处: ...
- java关于泛型的实验代码_[改善Java代码]强制声明泛型的实际类型
Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. importjava.util.Arr ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- java gt_JAVA泛型知识--gt; lt;? extends Tgt;和lt;? super Tgt;
extends T> 和 super T> 是Java泛型中的"通配符(Wildcards)" 和 "边界(Bounds)"的概念 extends ...
- java使用泛型后消除泛型_如何以及何时使用泛型
java使用泛型后消除泛型 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. ...
最新文章
- jQuery EasyUI API 中文文档 - DataGrid 数据表格
- 查单个值用什么resultset_视光门诊日记—为什么两个医院查的视力不一样
- flask第十篇——url_for【3】
- mysql-8.0.14-winx64,mysql-8.0.15-winx64 解压版安装教程及退出的三种方式
- php swoole udp,基于Swoole如何搭建UDP服务?
- ListView的CheckBox实现全部选中/不选中
- GTJ2018如何导出全部工程量_工程遇到带E的钢筋应该如何处理?
- CSS按钮动画(二)
- Total Commander工具栏图标 备份
- 第六章 jQuery选择器
- 突破百度知道瓶颈,问淘宝引流
- GIS技巧100例——10ArcGIS计算图斑椭球面积
- 东方卫视收视率查询_全国电视台收视率排行榜
- 操作系统:Win10有哪些版本,看完你就知道了
- windows播放函数PlaySound
- winscp使用教程 linux,WinSCP使用方法教程
- STEM创新教育-热量与马铃薯含水量之间的关系
- 计算机应用技术班级介绍,【完满超级团支部】计算机应用技术20-4班开展“点燃青春之火,成就辉煌人生”班级演讲活动...
- iOS 图片合成(一)
- 和菜头翻译 如何不靠运气致富