gpt4 book ai didi

java - 从内部匿名 Runnable 访问外部变量

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:03:45 26 4
gpt4 key购买 nike

以下示例代码 (SSCCE) 提示局部变量 a 必须是最终的。

public class Foo {

final List<A> list = new ArrayList() {{ add(new A()); }};

void foo() {
A a;
Thread t = new Thread(new Runnable() {
public void run() {
a = list.get(0); // not good !
}
});
t.start();
t.join(0);
System.out.println(a);
}

class A {}
}

为了让事情正常进行,我将代码更改为那个

public class Foo {

final List<A> list = new ArrayList() {{ add(new A()); }};

void foo() {

// A a;
final ObjectRef x = new ObjectRef();
Thread t = new Thread(new Runnable() {

public void run() {
// a = list.get(0);
x.set(list.get(0));
}

});
t.start();
t.join(0);

// System.out.println(a);
System.out.println(x.get());
}

class A {}

class ObjectRef<T> {
T x;

public ObjectRef() {}

public ObjectRef(T x) { this.x = x; }

public void set(T x) { this.x = x; }

public T get() { return x; }
}
}

我的问题:

  1. 这有什么问题吗?
  2. ObjectRef 类作为标准类存在于 JSE 中?
  3. 什么是正确的方法?

最佳答案

正确的方法是使用 FutureTask 和 Callable

FutureTask task = new FutureTask(new Callable<A>() {
public A call() {
return list.get(0);
}
});

Executor ex = Executors.newFixedThreadPool(1);
ex.execute(task);

// do something else, code is executing in different thread

A a = task.get(); //get result of execution, will wait if it's not finished yet


ex.shutdown();

关于java - 从内部匿名 Runnable 访问外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2295392/

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