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

时间:2013-08-05 05:43:08

标签: 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;
}   

这段代码给出了错误 - “userAnswer”必须是最终的,如果我把它作为最终,我不能为它分配一个值。请建议一种方法来处理这种情况。

3 个答案:

答案 0 :(得分:5)

如果您需要将java.util.concurrent.FutureTask<V>调整为Callable<V>,则可以使用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();

答案 1 :(得分:4)

有很多模式可以实现这一目标。也许最容易使用某种回调函数,例如:

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);   
    }
});

}

并调用这样的方法:

isTrue(new Callback() {
            @Override
            public void onSuccess(boolean value) {
                // do some stuff
            }
        });

答案 2 :(得分:2)

您可以查看Future界面:

  

Future表示异步计算的结果。方法   用于检查计算是否完成,等待它   完成,并检索计算结果。结果   只能在计算时使用方法get检索   完成,必要时阻止,直到准备就绪。取消是   由取消方法执行。提供了其他方法   确定任务是否正常完成或已取消。一旦   计算完成后,计算无法取消。如果你   我希望使用Future来取消可取性,但不是   提供可用的结果,您可以声明Future表单的类型   并且由于底层任务而返回null。