将值从异步调用返回到run方法

Lee*_*esh 3 java eclipse eclipse-plugin

我有一个必须返回布尔值的方法.该方法具有对run方法的异步调用.在run方法中,我必须在封闭方法中设置变量.下面是我的代码.

private boolean isTrue() {
    boolean userAnswer;
    Display.getDefault().asyncExec(new Runnable() {
        public void run() {
            userAnswer = MessageDialog.openQuestion(new Shell(), "some message", "some question?");
        }
    });
    return userAnswer;
}   
Run Code Online (Sandbox Code Playgroud)

这段代码给出了错误 - "userAnswer"必须是最终的,如果我做到最后我不能为它分配一个值.请建议一种处理此方案的方法.

aim*_*aim 5

有很多模式可以实现这一点。也许最简单的方法是使用某种回调函数,例如:

interface Callback {
    void onSuccess(boolean value);
}

private boolean isTrue(final Callback callback) {
Display.getDefault().asyncExec(new Runnable() {
    public void run() {
        boolean userAnswer = MessageDialog.openQuestion(new Shell(), "some message", "some question?");
        callback.onSuccess(userAnswer);   
    }
});
Run Code Online (Sandbox Code Playgroud)

}

并像这样调用方法:

isTrue(new Callback() {
            @Override
            public void onSuccess(boolean value) {
                // do some stuff
            }
        });
Run Code Online (Sandbox Code Playgroud)


Ren*_*ink 5

您可以使用java.util.concurrent.FutureTask<V>如果您需要适应Callable<V>a Runnable.

public class UserQuestion implements Callable<Boolean> {

    private String message;
    private String question;

    public UserQuestion(String message, String question) {
        this.message = message;
        this.question = question;
    }

    public Boolean call() throws Exception {
        boolean userAnswer = MessageDialog.openQuestion(new Shell(),
                message, question);
        return Boolean.valueOf(userAnswer);

    }
}

UserQuestion userQuestion = new UserQuestion("some message", "some question?");
FutureTask<Boolean> futureUserAnswer = new FutureTask<Boolean>(userQuestion);
Display.getDefault().asyncExec(futureUserAnswer);
Boolean userAnswer = futureUserAnswer.get();
Run Code Online (Sandbox Code Playgroud)


npi*_*nti 2

您也许可以看一下界面Future

Future 表示异步计算的结果。提供了方法来检查计算是否完成、等待计算完成以及检索计算结果。计算完成后只能使用 get 方法检索结果,必要时会阻塞,直到准备好为止。取消是通过cancel方法来执行的。提供了其他方法来确定任务是否正常完成或已取消。一旦计算完成,就无法取消计算。如果您想使用 Future 来实现可取消性,但又不想提供可用的结果,则可以声明 Future 形式的类型,并返回 null 作为基础任务的结果。