Java线程开发疑问:为何无法调用t1.setActive()及解决办法
为什么无法调用
t1.setActive()?怎么解决? 嘿,我来帮你把这个问题掰明白!
问题根源
你现在遇到的是Java静态类型检查导致的问题:
- 你声明的
t1变量类型是Thread,但setActive()是你的自定义子类ThreadOne特有的方法。 - Java编译器只会根据变量声明的类型(也就是
Thread)来检查可用方法,而java.lang.Thread类本身根本没有setActive()这个方法,所以编译器直接报错,不让你调用。
简单说就是:你把子类对象存在了父类类型的变量里,向上转型后,父类类型看不到子类的特有方法。
解决方案
这里有几种靠谱的解决办法,你可以根据自己的代码场景选:
1. 直接把变量声明为子类类型
最直接的方式,把t1的类型从Thread改成你的ThreadOne,这样编译器就知道这个变量拥有ThreadOne的所有方法了:
public void runThreads() throws InterruptedException { // 直接声明为ThreadOne类型 ThreadOne t1 = new mainProgram().new ThreadOne(); t1.start(); // 别忘了启动线程! t1.setActive(); // 现在就能正常调用了 }
另外提一句:你的ThreadOne已经继承了Thread,没必要再用new Thread(...)把它包起来,那样会额外创建一个Thread对象,完全是多余的~
2. 向下转型(如果必须用Thread类型变量)
如果因为某些原因,你必须把t1声明为Thread类型,那可以通过向下转型把它转成ThreadOne,再调用方法。记得先做类型检查,避免ClassCastException:
public void runThreads() throws InterruptedException { Thread t1 = new mainProgram().new ThreadOne(); t1.start(); // 先判断类型,再强制转型调用 if (t1 instanceof ThreadOne) { ((ThreadOne) t1).setActive(); } }
额外的线程安全建议
最后提醒你一句:你的active变量是多线程环境下的共享变量,最好给它加上volatile修饰符,保证变量的可见性,不然其他线程可能看不到active的修改:
// 在ThreadOne类里修改active的声明 private volatile boolean active = true; // 假设初始值是true
内容的提问来源于stack exchange,提问作者user10990200
相关产品推荐
相关产品推荐

