创建Thread或Thread子类对象,再调用对象的start()方法则线程进入就绪态。
run方法执行完则线程进入终止态。
以上三种方式,第一种方式代码受Java只支持单继承限制;只有第三种方式父线程能拿到子线程返回结果。
对于第二种方式,因为匿名内部类里边访问外部的变量,实际上都必须是final类型的变量,而final修饰的变量是线程安全的,因此也就模拟不出来出错的情况了。特别的,在JDK8中,第二种写法会自动在底层加上final修饰符(待验证)。所以,想要模拟多个线程访问共享变量的情况,不要使用匿名内部类。
因为在匿名内部类中引用的外部对象受到外部线程的作用域的制约有其特定的生命周期,以线程为例,当外部的变量生命周期已经完结之后,内部的线程还在运行,怎么样解决这个外部生命周期已经结束而在内部却需要继续使用呢,这个时候就需要在外部变量中添加final修饰符,其实内部匿名类使用的这个变量就是外部变量的一个“复制品”,即使外部变量生命周期已经结束,内部的“复制品“依然可用。
由上,笔者认为应也是为了保证参数的线程安全。
https://blog.csdn.net/qq_36129922/article/details/82883464
https://blog.csdn.net/weixin_40003295/article/details/81097783
https://zhidao.baidu.com/question/572436227.html
原文:https://www.cnblogs.com/coding-gaga/p/12381013.html