最近在写项目代码时出现这样一个空指针问题,t1,t2线程需要同一批的共享变量。这些变量在主线程中初始化后,通过构造方法传递给t1,t2线程后,启动t1,t2。(t1线程为定时检测任务,t2线程t1线程依赖t2线程的结果,故通过阻塞队列完成t2的阻塞,保证共享变量的安全性)。
由于主线程,t1,t2需求的共享变量属性基本相同,故考虑使用父类来将共享变量约定好,然后由主线程给父类的属性赋值,这样t1,t2同样作为子类就可以拿到所需变量了。
image.png
我用一个demo来还原出现nullpoint异常的场景吧。
public class father {
public ArrayList<Integer> list;
}
public class son1 extends father{
son2 s=new son2();
public void start() {
list = new ArrayList<Integer>();
list.add(1);
}
public void get() {
s.get();
}
public static void main(String[] args) {
son1 son1 = new son1();
son1.start();
son1.get();
}
}
public class son2 extends father{
public void get() {
System.out.println(list);
}
}
son1为father赋值之后,son2的get方法去调用父类的list,结果如下所示
image.png
问题就出在我想当然的把所有子类的的父类当成同一个,其实当写出
son1 son1 = new son1();
son2 s=new son2();
的时候,就应该反应过来他们的父类不是同一个,而是各自有各自的父类,所以刚才那张图正确的画法还是
image.png
但同一属性却在三个实现类中写三遍属实难看,且t1,t2线程中存在相似的方法调用,最终的结果是保留父类将主线程,t1,t2线程的属性通过构造方法传递给各自的父类,父类整合各线程的相似方法,并为共通方法提供统一接口,也是把项目在开发中杂乱的逻辑代码重构。方便自己和他人阅读。
就这样吧。
网友评论