关于排序算法的稳定性
稳定,即不需要交换相同的元素。
考虑一种情况,有一个已经按照姓名排好序的员工列表,现在需要按照工资再次排序。如果有两个员工的工资相等。那么稳定的排序算法,将会保留按名字排列好的顺序。排序的结果将产生这样一个列表:首先按照工资排序,工资相同者再按照姓名排序。而不稳定的排序算法,将会打乱原来按姓名排好的序列。
关于阻塞队列
对于许多多线程问题,都可以抽象成生产者与消费者问题,可以通过使用一个或多个队列将其形式化,生产者线程像队列插入元素,消费者线程从队列中取出元素。当试图向队列添加元素而队列已满或者想从队列移出元素而队列为空的时候阻塞队列导致线程阻塞。
关于代理
Java中的代理实例代码1
Java中的代理实例代码2
动态代理是在程序运行时,运用反射机制动态创建而成的。java.lang.reflect包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。 动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。要实现一个继承了InvocationHandler接口的请求处理器类,在该类中可以添加对被代理类的控制。
public class YourHandler implements InvocationHandler{
// 要代理的原始对象
private Object obj;
public YourHandler(Object obj) {
super();
this.obj = obj;
}
/**
* 在代理实例上处理方法调用并返回结果
*
* @param proxy 代理类
* @param method 被代理的方法
* @param args 该方法的参数数组
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
// 调用之前
doBefore();
// 调用原始对象的方法
result=method.invoke(obj, args);
// 调用之后
doAfter();
return result;
}
private void doBefore(){
System.out.println("before method invoke");
}
private void doAfter(){
System.out.println("after method invoke");
}
}