Return 来自后台线程中 lambda 函数的值,抛出 NullPointerException
Return value from lambda function in background thread, throw NullPointerException
在我的用例中,我想 return 来自 lambda 函数的用户对象,如下面的代码所示。在发布我的问题之前,我尝试了许多类似的问题,例如 this and 但没有主题可以解决我的问题,这是我的代码:
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
}
}
当我 运行 这段代码时,我得到 "Exception in thread" main "java.lang.NullPointerException"。我的问题是如何获得由 work () 函数构建的 User 对象,但是这个函数应该 运行 在后台线程中,就像在代码中一样。
findUser
return 马上, return 就 null
因为 mUser
还没有设置。您需要等待它被设置,或者 return 调用者可以等待的 Future<User>
。
在我的用例中,我想 return 来自 lambda 函数的用户对象,如下面的代码所示。在发布我的问题之前,我尝试了许多类似的问题,例如 this and
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
}
}
当我 运行 这段代码时,我得到 "Exception in thread" main "java.lang.NullPointerException"。我的问题是如何获得由 work () 函数构建的 User 对象,但是这个函数应该 运行 在后台线程中,就像在代码中一样。
findUser
return 马上, return 就 null
因为 mUser
还没有设置。您需要等待它被设置,或者 return 调用者可以等待的 Future<User>
。