我正在尝试使用下面的类对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 version。它仍然应该是“有效的最终”或将其移至成员变量。this
指的是Runnable,您应该使用Stream.this
将其括起来。
关于java - 如何在Runnable中捕获封闭范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36680161/