一、泛型
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 attribute
private double diskUsage;
private volatile int diskThreshold=80;
private volatile boolean stop=false;
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public 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;
}
@Override
public void stopAndExit() {
stop=true;
}
public boolean isStopped(){
return stop;
}
@Override
public 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;
}
@Override
public void setDiskUsage(double diskUsage) {
// TODO Auto-generated method stub
this.diskUsage = diskUsage;
}
@Override
public List<String> listFiles(String directory) {
// TODO Auto-generated method stub
File 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.Integer
System.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.Integer
for (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