当我安排好的定期工作请求运行时,可能我不希望它当时做任何工作,而只是等待定期系列中的下一个。
目前,我正在通过将Completer
设置为成功状态并在触发异步工作资料之前返回来处理此问题,如下所示:
public ListenableFuture<Result> startWork() {
return CallbackToFutureAdapter.getFuture(completer -> {
if ( notThisTime() ) {
completer.set(Result.success());
return "nothing to do this time";
}
// the following will call completer.set(Result.success()) when it is finished...
startSomeAsyncStuff(completer);
return "started some async stuff";
});
}
这是应该怎么做?还是应该运行notThisTime()
检查之前 getFuture()
并返回设置为已完成声明的ListenableFuture
或类似内容?
是的,这是正确的处理方式。
[除非您拉入全部番石榴,否则创建ListenableFuture
对象的唯一方法是通过CallbackToFutureAdapter.getFuture
,因此,无论如何都必须调用它以获取对completer
的访问权并调用set(Result.success())
。] >
startWork()
和getFuture
lambda都在主线程上运行,因此在该线程上进行阻塞工作同样不安全,因此您应确保notThisTime()
在任一位置上都可以在主线程上安全运行。