我正在尝试使用下面的类在 HandlerThread
上进行更新流,但我有几个关于 Java 中变量捕获如何工作的问题。
[1] ret
是否通过引用从封闭范围中捕获?
[2]this
是否引用 Runnable
,还是从封闭范围捕获的?
[bonus] 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 version 。但它仍然应该是“有效的最终”或将其移至成员变量。
this
指的是 Runnable,您应该使用 Stream.this
来封装它。
关于java - 如何捕获 Runnable 中的封闭范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680161/