23。现在在设计一个自己用的多线程的程序。架构什么完全自己来设计,在实际的设计过程中,产生了一个这样的疑惑。就是是否需要把一个线程内做的事情,压缩成一个进程。估计说的有点模糊
public interface Task {
public void execute();
}
这是一个接口。execute为要执行的任务的具体执行方法。那么问题也就是,如此的一个接口是否需要继承Runnable接口?这个问题,目前为止还没有正式决定。所以我这里只能说说我的想法和暂时的决定。
基本的思路,还是降低耦合度。如果让Task继承Runnable接口。那么任务的具体执行就必须要以一个线程的角度来思考。换句话说,Task是 Runnable的,是其一个特例。这看起来很美。但是要由于一旦这样的耦合,那么Task如果想要扩展,就会变得相当的麻烦,因为它和线程已经耦合。比如说我要在execute之前执行一个操作A,之后,需要做一个操作B。那么我必须修改execute代码。或者用Spring的AOP。但是如果不是这样做,又感觉做的很麻烦。类很多。
24。由于很喜欢Spriong的DI。写手机程序的时候不能用Spring。所以就自己模仿着Spring来写一个建议的Factory类。基本实现,用的是反射。不过遇到了个问题。
public Object getBean(String bean,Object...args)
这个方法的实现过程中,比方说有个这样的类
class Foo{
public Foo(Object object){
}
}
但是如果调用工厂方法的getBean( bean,new String("test"))总是报找不到方法的错误。这才明白,确定方法的时候,参数的子类不能用来确定方法。后来写了一个,才解决问题。
protected Constructor<?> getConstructor(String bean,Class<?>[] argtype) throws NoSuchMethodException{
Constructor<?> result = null;
//get class by bean name
Class<?> beanclass = this.getClassObject(bean);
//get constructor's array
Constructor<?>[] bean_cons = beanclass.getConstructors();
Class<?>[] cons_type; //the arg type for each constructor
//loop the constructor's array and find the constructor
for(Constructor<?> constructor:bean_cons){
cons_type = constructor.getParameterTypes();
if(cons_type.length==argtype.length){
try{
for(int i=0;i<cons_type.length;i++){
//check each arg's class is same or is sub class for the
if(!(cons_type[i].equals(argtype[i])||
cons_type[i].isAssignableFrom(argtype[i]))){
throw new HasNotFoundException(); //这个异常只是为了代码的美观。
}
}
result = constructor;
return result;
}catch(HasNotFoundException e){
}
}
}
throw new NoSuchMethodException();
}
25。回到那个Task。现在先用一个ThreadTask,继承Task和Runnable来解决问题。也算是面向对象的优势吧。可以通过继承,来提供另一套的解决方法。
26。这只能算是一个尝试吧。
public interface Task {
public void execute();
//这只是一个标志类
public static interface TaskProperty{
}
}
因为每个Task所需要的信息完全不相同。所以想要把其信息封装成一个一个TaskProperty。这样进行的不知道效果会怎么样?
至少现在有点感觉画蛇添足的感觉,因为这样可以使得每个Task能够解耦。但是却使得TaskProperty封装了起来。不过觉得这样做能够使得行为和数据分离。对这一块还是很不了解。慢慢。看写好后的效果怎么样。