【参考链接】
我们在启动线程的时候,也经常使用匿名内部类的方式,那么此时内存的状态是怎样的呢?
以如下代码为例
已经加了断点,在Eclipse中启动调试,两个线程都停在了加断点的地方
在main线程中,有main()方法的栈帧,其中有两个局部变量,String[0]类型的args和Test类型的t。 (因为main()方法是静态的,所以没有局部变量this)
在Thread-0线程中,有匿名内部类.run()方法的栈帧。其中有两个局部变量,匿名内部类Test$1类型的this和float类型的f(因为是非静态的所以有this)
并且this对象的结构如下
说明如上一节的匿名内部类所讲,会自动为这个匿名内部类添加成员变量:this$0、val$arg1、val$v1
在创建这个匿名内部类的对象的时候,将外部对象赋值给this$0,将所在的外部类方法中的局部变量赋值给val$arg1、val$v1。
然后以这个run()方法作为新线程的启动方法
总结来说就是
虽然run()方法没有参数,但是其作为非static方法有默认有一个局部变量指向其匿名内部类对象,而这个匿名内部类对象中又有成员指向外部类对象,有成员赋值自所在方法的局部变量。
经常会直接在run()方法中访问外部类的对象类型成员变量,此时原线程、子线程就都是在访问同一个对象,可能导致并发问题。