从方法中多次返回?

Lis*_*nne 7 java concurrency multithreading return

我有一个方法需要一段时间才能完成.我希望我的方法在返回"最终"结果之前返回"初步"结果.

我想知道是否有可能这样的事情:

public Object myMethod () {
    /*some computation here*/

     return firstResult;

     /*
     very long computation here
     */

     return finalResult;
}
Run Code Online (Sandbox Code Playgroud)

这甚至是可能的,还是可以建议某种解决方法?

Nat*_*hes 6

您可以将长时间运行的任务放在执行程序上(它将使用线程池异步执行任务)并返回一个您可以在以后使用以获得答案的Future.当您调用get未来时,它会一直阻塞,直到任务完成,因此您可以立即使用初始答案,并Future.get在以后需要更高精度时调用,并将任务完成一段时间.

返回值可能如下所示:

class MyMethodReturnStuff {

    private Object quickAnswer;
    private Future longAnswer;
    private long startTime = System.currentTimeMillis();

    MyMethodReturnStuff(Object quickAnswer, Future longAnswer) {
        this.quickAnswer = quickAnswer;
        this.longAnswer = longAnswer;
    }

    Object getAnswer(long expectedDelay) {
        return System.currentTimeMillis() - startTime < expectedDelay ?
        quickAnswer : longAnswer.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望长计算花费5秒钟,getAnswer(5000)如果小于5秒,则调用将返回快速答案,否则将返回longAnswer.