采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,这里有一点疑惑和误解,这个getInstance返回的是安全的Listener,但是程序中没有调用,这个对象是返回给谁呢?我运行的时候,发现这个listener一直是null值,不会执行onEvent这个方法,输出“还未初始化完毕!”。 用了您的源码依旧是这样,是不是要在构造函数里调用getInstance呢
返回的安全的Listener可以不使用,重点是有了getInstance方法后,我们一旦运行完getInstance函数,就代表listener已经准备完毕了,可以正常处理事件了,所以主函数可以这样写:
public static void main(String[] args) { MySource mySource = new MySource(); MultiThreadsError7 safeListener = getInstance(mySource); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } mySource.eventCome(new MultiThreadsError5.Event() { }); } }).start(); }
感谢!
实在不知道这一节和注册监听器那一节的目的在哪里,老师你在这里这样写,那在监听器那一节也可以把创建对象写在启动线程前面,这样的运行结果也没问题啊。注册监听器那一节我的理解是,在主函数创建的线程里直接就调用了source.eventCome,而注册监听器是发生在下面的创建对象的构造函数里,而在构造函数里又有匿名内部类直接引用了类中的属性(而该属性的赋值是在注册监听器下面),导致没有初始化完成,所以count打印出来是0。但是我不懂为什么要这样写。老师也没有稍微说一说具体点儿的应用场景。在这一节,又用所谓的工厂方法把注册监听器和初始化对象分开,其实那样写,和在构造函数中,先定义监听器对象,再做该做的初始化工作,最后再把监听器注册给mySource,不是一样的吗,为什么用工厂方法呢?(而且我也不理解MultiThreadsError7这个类在业务中的作用是什么,看上去它只是注册了监听器,给count赋值,然后做一些其他的工作,这些为什么一定要在构造方法中做呢?)
主要是为了演示可能导致线程问题的场景。在业务开发中,我们不需要这样写,不需要把这些放到构造函数中执行。这是错误案例演示。
登录后可查看更多问答,登录/注册
完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题
2.4k 26
1.4k 12
1.5k 12
3.0k 12
1.5k 11
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号