gpt4 book ai didi

java - 如何在 Runnable 中捕获封闭范围

转载 作者:搜寻专家 更新时间:2023-11-01 07:49:43 26 4
gpt4 key购买 nike

我正在尝试使用下面的类在 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,它应该是 final。局部变量不能引用为非 final 的原因是因为局部类实例可以在方法返回后保留在内存中。它还取决于 java version .它仍然应该是“有效最终的”或将其移至成员变量。

this 指的是Runnable,你应该使用Stream.this来封装一个。

关于java - 如何在 Runnable 中捕获封闭范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com