从后台线程中的lamda函数返回值,抛出NullPointerException

问题描述 投票:0回答:1

在我的用例中,我想从lamda函数返回一个用户对象,如下面的代码所示。在发布问题之前,我尝试过许多类似的问题,例如thisthis,但是没有主题可以解决我的问题,这是我的代码:

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对象,但该函数应在代码中的后台线程中运行。

java multithreading lambda concurrency runnable
1个回答
0
投票

findUser立即返回,并且由于尚未设置null而返回mUser。您需要等待它的设置,或者返回呼叫者可以等待的Future<User>

© www.soinside.com 2019 - 2024. All rights reserved.