[英]Is it possible to use a non-final in an enclosing scope like a runnable (no.)
[英]How to capture enclosing scope in Runnable
我正在尝试使用下面的类在HandlerThread
进行更新,但是我有几个关于变量捕获在Java中如何工作的问题。
[1]是否通过引用从随附的示波器中捕获了ret
?
[2] this
是指Runnable
,还是从封闭范围捕获的?
[奖励] StartStream
应该将Runnable
到处理程序线程,并且仅在Runnable
完成后才返回。 下面的代码能按预期工作吗?
public class Stream extends HandlerThread {
Handler handler = null;
Stream() {
super("Stream");
handler = new Handler(getLooper());
start();
}
private int _startStream() { // Start some repeating update
return 1;
}
public int StartStream() {
int ret = -1;
handler.post(new Runnable(){
@Override public void run() {
synchronized(this) {
ret = _startStream(); // [1]
this.notify(); // [2]
}
}
});
synchronized(this) {
while(ret == -1) {
try {
this.wait();
}
catch (InterruptedException e){}
}
}
return ret;
}
}
内部类对外部类有隐式引用。
要在匿名内部类中使用ret
,它应该是最终的。 局部变量不能引用为非最终变量的原因是因为方法返回后,本地类实例可以保留在内存中。 它还取决于Java版本 。 它仍然应该是“有效的最终”或将其移至成员变量。
this
是指Runnable,您应该使用Stream.this
来封闭它。
ret
是局部变量,因此需要有效地最终确定。 这意味着,在将ret
初始化后,如果将ret
分配给另一个值,编译器会抱怨。 因此,[1]会导致编译器错误。
这是因为Java语言架构师希望防止局部变量(在方法中声明的变量)从声明它的方法之外的其他地方更改。
有关从封闭方法捕获变量的更多信息:
this
确实是指Runnable
实例。 但是,可以使用Stream.this
引用封闭的Stream
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.