【问题标题】:Return value from lambda function in background thread, throw NullPointerException从后台线程中的 lambda 函数返回值,抛出 NullPointerException
【发布时间】: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


【解决方案1】:

findUser 立即返回,它返回 null 因为尚未设置 mUser。您需要等待它被设置,或者返回调用者可以等待的Future<User>。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多