- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想获得您对以下问题和解决方案(可能)的反馈。
假设有一个可运行任务对 CPU 使用情况进行采样并将其写入 CSV 文件。此任务不返回任何结果。这需要安排为永远定期执行。如果用户取消任务,我们将关闭文件编写器,用户可以下载 CSV 文件。
当你向 ListeningScheduledExecutorService 提交这样的任务时(如下所示),你会得到一个代表任务结果的 ListenableScheduledFuture 。
ListenableScheduledFuture<Void> future = (ListenableScheduledFuture<Void>) scheduledExecutorService
.scheduleAtFixedRate(task, initialDelay, interval, timeUnit);
我们注册一个回调到 future ,以便当任务被取消时,CSV文件就可以下载了:也就是说,我们需要将ListenableScheduledFuture转换为ListenableScheduledFuture。
Function<Void, File> transformFunc = new Function<Void, File>()
{
@Override
public File apply(Void arg0)
{
return file;
}
};
ListenableScheduledFuture<File> futureToListen = (ListenableScheduledFuture<File>) Futures.transform(future, transformFunc);
// register a callback to the ListenableScheduledFuture<File>
Futures.addCallback(futureToListen, callback, executorService);
注意:根据 Guava API DOC 1 ,取消 futureToListen 应该会导致我们的任务被取消。
问题:
由于任务结果为空,因此如上所示强制转换为 ListenableScheduledFuture 是否有意义?
将返回 void 的任务的 future 转换为某种类型的 future 在语义上有意义吗?
有更好、更优雅的解决方案吗?使用Java8的CompletableFuture会更好吗?
最佳答案
transform
可能不会做你想做的事。您提到取消 futureToListen
将取消 future
,这是事实。问题是,保留也是如此:当 future
被取消时,futureToListen
也会被取消。这意味着它永远不会计算其结果。
要解决此问题,您有几个选择:
future
,请将 futureToListen
更改为 SettableFuture
。然后让取消 future
的人也调用 futureToListen.set(file)
。future
,请将 futureToListen
更改为 AbstractFuture
,它 (a) 公开 set()
(以便您可以执行我在 (1) 中建议的操作),并且 (b) 实现 interruptTask()
来调用 future.cancel()
。还有其他可能的聪明解决方案,涉及每当 future
完成不成功时触发工作,但我不确定我是否会推荐。我个人对于使用“Future 被取消”作为“工作已成功完成”的信号感到有点紧张。这是因为例如,Future 也可以通过执行程序关闭来取消。 (另一个原因:您需要小心区分“执行期间引发异常”和“被取消”。)因此,我建议的解决方案设置为直接调用 set()
,而不是触发 future 的任何取消。
关于java - 将 ListenableScheduledFuture<Void> 转换为 ListenableFuture<SomethingElse>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686704/
我正在寻找转换 ListenableFuture> 的最佳方法进入个体序列ListenableFutures .这是我正在寻找的方法签名: public Iterable> splitAndRun(
如果在主题上成功发布了学生,我想将StudentDto返回给控制器。但因为onSuccess是在响应返回给控制器之后调用的。如果StudentDto成功发布,我有什么方法可以将其返回到。。如果在主题上
首先我只想说我是 akka 和 Futures 的新手。所以要温柔:)。 我在某个类中有 init 方法,它返回 ListenableFuture 。这个方法应该在单独的线程中执行一些耗时的代码,并创
我对 Futures 很陌生,并且陷入了链接调用和创建对象列表的困境。我使用的是 Android,API 最小值为 19。 我想编写下面的方法getAllFoo(): ListenableFuture
我第一次尝试使用ListenableFutues,在使用addCallback方法时出现错误,请帮忙。 附件是代码的快照。错误是: error: expected Futures.add
在向 ExecutorService 提交任务时,使用 ListenableFuture 处理结果是否有任何优势,而不是通过简单地调用处理该任务的函数来以普通的旧 java 方式进行处理?结果? fu
我有一个 Spring Cloud 微服务,它在 Kafka 代理上发布消息,该微服务可通过 REST API 访问。 我想将提交状态返回给调用者,但似乎 Java 不等待。如何使其在我的代码返回之前
我正在使用 Spring 4.2.3 AsyncRestTemplate.exchange() 调用一些需要几秒钟的 API,我希望 listenableFuture.get(1, TimeUnit.
有一个服务使用 Spring AsyncRestTemplate 来发送 rest 调用。每次调用 AsyncRestTemplate.exchange() 都会返回 ListenableFuture
我想使用 apache 异步 http 客户端进行异步 http 调用,以便每个线程运行多个调用。 此处列出了代码:https://hc.apache.org/httpcomponents-async
有没有一种简单的方法(提供库)来组合两个 com.google.common.util.concurrent.ListenableFuture并从第一个完成的结果中获取结果。 类似于 coalesce
我正在编写一个 Controller ,我需要使其异步。我如何处理 ListenableFuture 的列表?因为我有一个 URL 列表,需要一一发送 GET 请求,那么最好的解决方案是什么? @Re
有一个服务使用 Spring AsyncRestTemplate 来发送 rest 调用。每次调用 AsyncRestTemplate.exchange() 都会返回 ListenableFuture
我正在读取一个大的 URL 文件并向服务发出请求。该请求由返回 ListenableFuture 的客户端执行。现在我想保留一个 ListenableFuture 池,例如最多同时执行 N 个 Fut
当使用 Guava 的 ListenableFuture 时,如何知道失败的任务。示例 FutureCallback future = new FutureCallback() { @Overri
我正在处理一个问题,我有一个 List> .我想将所有这些 future 的结果汇总成一个 List超时。天真的方法是这样的: List blockForResponses(List> futures
根据我看到的 Guava 示例,我一直在寻找优雅的解决方案来解决我的问题。具体来说,我喜欢 Futures.addCallback(ListenableFuture, FutureCallback)
我努力了,但没有找到任何文章或博客清楚地比较了 ListenableFuture 和 CompletableFuture,并提供了很好的分析。 所以如果有人能解释或指向我这样的博客或文章,那对我来说真
我正在尝试为 ListenableFuture 添加回调编写单元测试用例,但我不知道该怎么做。在互联网上没有得到任何有用的东西。 @Test public void can_publish_
我有一个专用的Stack S,里面装满了类外部的对象(使用方法)。 ListenableFuture应该读取堆栈并从中检索对象, 但是,如果堆栈为空,则应等待将对象插入到堆栈中,然后再检索它。我不确定
我是一名优秀的程序员,十分优秀!