xml封装、线程的创建、垃圾回收机制

xml封装

封装思路:

  • 要求:提供对应的方法,能够让用户可以根据ID或者文件路径来获取对应的对象
  • 解析给定的xml文件,将解析后的ID和class文件的值储存起来(使用键值对),根据用户给定的条件(ID,路径名)返回对应的class对象
    步骤:
    1、解析用户指定的xml文件,返回解析后的文档( Document)对象
	public static Document newInstance(String xmlPath) {
		//获取document对象
		SAXReader reader = new SAXReader();
		//创建document对象
		Document document = reader.read(new FileInputStream(xmlPath));
		return document;
	}
	

2、创建Map集合用于存储解析后的ID和class的值

	public static void parseInMap(String xmlPath) {
		Document document = newInstance(xmlPath);
		//获取xml的根节点
		Element rootElement = document.getRootElement();
		//找到其子节点(bean标签)
		List<Element> elementList = rootElement.elements();
		//遍历集合,拿到单独的节点对象,判断elementList集合是否为空
		if(null !=elementList) {
			for(Element em:elementList) {//外循环bean标签
				//使用子节点获得对应的属性对象 
				//将节点中的所有属性封装到了一个List<Attribute>
				List<Attribute> attrList= em.attributes();
				String key =null;
				String val = null;
				//遍历属性集合,获取节点上对应的属性及值
				for(Attribute attr : attrList) {
					String keyName = attr.getName();
					String keyVal = attr.getValue();
					//判断当前是key还是val
					if("id".equals(keyName)) {
						key =keyVal;
					}
					if("class".equals(keyName)) {
						val = keyVal;
					}
				}
				//将key val值存储在集合中
				map.put(key,val);
			}
		}
	}

3、定义一个功能–根据ID返回对象

	public static Object getInstanceByID(String id){
		Set<Map.Entry<String,Object>> set = map.entrySet();
		//获取迭代器
		Iterator<Map.Entry<String,Object>> it = set.iterator();
		while(it.hasNext()) {
			Map.Entry<String, Object> entry = it.next();
			//获取key 和val
			String idVal = entry.getKey();
			if(id.equals(idVal)) {//指定的id存在
				//返回对应的对象(通过反射处理);
				String className = (String)entry.getValue();
				//开始反射
				Class cls = Class.forName(className);
				//反射要求必须要有一个无参构造器
				Constructor cons = cls.getConstructor();
				//返回无参构造器对应的对象
				return cons.newInstance();
			}
		}
		return null;
	}

4、定义一个功能–根据路径名返回对象

线程的创建

进程:就是一个正在运行的程序
线程:是进程中的一个单元
在一个进程中可以包含多个线程; 火车站售票可以比喻成为一个进程,售票窗口为线程
当需要同一时刻做多件事,就需要开启多个线程
1、线程中的任务不需要手动调用,而是通过start方法在创建并开启线程后自动调用的
2、多个线程之间的运行是互不影响的
3、线程的运行是随机的(和资源争夺有关)
第一种方法:

class SubThread extends Thread{
	 //run方法主要定义该线程要执行的任务
	@Override
	public void run() {
			System.out.println("线程开始");
	}
}
 SubThread thread = new SubThread();
	thread.start();  //想要执行线程必须调用start方法

第二种方法:

class SunRun implements Runnable{
	@Override
	public void run() {
			System.out.println("线程开始执行");
	}
}
	//实现 Runnable接口是为了定义任务  多态
	Runnable run = new SunRun();   
	//此处的Thread对象是用于创建并开启线程的,他当中没有指定的任务
	Thread thread = new Thread(run); //将任务传入
	thread.start();
	int a = 1/0;
  • 两种线程方式如何选择?
  • 选第二个 选继承的话也就意味着该子类不能再继承其他类、扩展性不好
垃圾回收机制

虚拟机的内存是有限的,因此,对于在程序运行过程中创建的对象(占用的资源),虚拟机需要对其进行监控,当发现有对象不再有引用的时候就将其进行回收,该回收的动作是贯穿整个程序的,它是一个单独的线程,称该线程为垃圾回收机制。
1、垃圾回收机制是java虚拟机中自动执行的一个线程,
2、当程序中存在垃圾对象需要回收时,垃圾回收机会自动进行回收,但是,回收是不定时的
3、 并不是有了垃圾就自动回收,对于垃圾是否要进行回收,需要先判断其是否为可回收(需要回收)的垃圾
4、在System类中有一个方法叫gc();用于通知的,对于每个实体类而言,其本身都自带了执行垃圾回收的功能
5、 问题:到底哪种对象才能被确认是垃圾对象?
在垃圾回收机制中定义了很多回收的算法,比较经典的算法为年代算法,其中分为新生代、老年代、及持久代, 新生代用于生命周期最短的对象,经历多次的回收仍然存在的,当其内存满了,会将其复制到老年代,当老年代中内存也满了会直接发出Full cg进行清理。java中的类等静态资源都放在持久代中

强引用当内存不足时,垃圾回收器也不会回收强引用的对象
软引用当内存充足时不回收,内存不足时,会回收该对象
弱引用不管内存是否充足,都会回收该对象
虚引用用于跟踪垃圾回收器的回收活动
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值