我正在尝试使用下面的类对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/

10-13 03:27