【发布时间】:2020-05-06 14:47:00
【问题描述】:
在我的用例中,我想从 lambda 函数返回一个用户对象,如下面的代码所示。在发布我的问题之前,我尝试了许多类似的问题,例如 this 和 this 但没有一个主题可以解决我的问题,这是我的代码:
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AppDatabase {
private static final int NUMBER_OF_THREADS = 4;
public static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
}
public class MyClass {
private User mUser;
public User findUser(){
AppDatabase.databaseWriteExecutor.execute(() -> {
mUser = work();
});
return mUser;
}
public User work(){
//simulate get user from database
User user = new User();
user.setName("Toto");
return user;
}
}
public class Main {
public static void main(String[] args) {
MyClass myClass = new MyClass();
User user;
user = myClass.findUser();
System.out.println(user.getName()); //this line: Exception in thread "main" java.lang.NullPointerException
}
}
当我运行此代码时,我得到“线程中的异常”主“java.lang.NullPointerException”。我的问题是如何获取由 work() 函数构建的 User 对象,但该函数应该像代码一样在后台线程中运行。
【问题讨论】:
-
findUser立即返回,它返回null因为尚未设置mUser。您需要等待它被设置,或者返回调用者可以等待的Future<User>。 -
@DavidConrad 你会回答你的评论,以便可以接受将他的页面标记为已解决?
-
@BasilBourque 当然,虽然感觉答案有点稀疏,而且我可能没有时间很快展开。
-
@DavidConrad,谢谢!
标签: java multithreading lambda concurrency runnable