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)
这甚至是可能的,还是可以建议某种解决方法?
您可以将长时间运行的任务放在执行程序上(它将使用线程池异步执行任务)并返回一个您可以在以后使用以获得答案的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.