为什么将“this”传递给Thread构造函数是一种不安全的构造技术?如果是那么替代方案是什么?它与测试或调试有关吗?我找到了一些答案,但没有完全理解。
class NewThread implements Runnable {
Thread t;
NewThread(){
t = new Thread(this,"My new Thread");
}
}
答案 0 :(得分:5)
将this
传递给线程构造函数没有任何问题。我怀疑你所指的是将this
传递给线程构造函数,在你自己的构造函数中。
class MyClass implements Runnable {
private final Integer value;
MyClass() {
new Thread(this);
int i = 0;
value = Integer.valueOf(20 / i);
}
@Override
public void run() {
System.out.println(value.intValue());
}
}
一般来说,从构造函数中“泄漏”this
- 引用是一个坏主意,因为如果构造函数抛出异常,该对象可能会处于不一致状态。
更具体地说,在构造函数中使用this
启动一个线程是个坏主意,因为线程可能在构建完对象之前开始运行。因此,即使i
为1,run()
仍可能会抛出,因为它可能会在value
被分配之前发生。
在某些情况下,您可以通过在构造函数的最后一行创建线程来解决这个问题。但这并非万无一失,因为该构造函数可能被超类调用。更好的解决方案是:
class MyClass implements Runnable {
...
MyClass start() {
new Thread(this);
return this;
}
...
}
// Then construct like this:
MyClass foo = new MyClass().start();