将ListenableScheduledFuture <Void>转换为ListenableFuture <SomethingElse>

爱因斯坦

我想就以下问题和解决方案(潜在的)获得您的反馈。

假设有一个Runnable任务,它采样CPU使用率并将其写入CSV文件。此任务不会返回任何结果。需要将其安排为永远定期执行。如果用户取消任务,我们将关闭文件编写器,并且用户可以下载CSV文件。

当您将这样的任务提交给ListeningScheduledExecutorService(如下所示)时,您将获得一个ListenableScheduledFuture,它代表任务的结果。

ListenableScheduledFuture<Void> future = (ListenableScheduledFuture<Void>) scheduledExecutorService
            .scheduleAtFixedRate(task, initialDelay, interval, timeUnit); 

我们注册了一个将来的回调,以便在取消任务后可以下载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应该导致我们的任务被取消。

问题:

  1. 由于任务结果无效,因此如上所示将其强制转换为ListenableScheduledFuture是否有意义?

  2. 从语义上讲,将将无效返回的任务的未来转换为某种类型的未来是否有意义?

  3. 有没有更好,更优雅的解决方案?使用Java8的CompletableFuture会更好吗?

克里斯·波维尔克

transform可能不会做你想要的。您提到取消futureToListen将取消future,这是事实。问题在于储备金也是如此:当future被取消时,也将futureToListen取消这将意味着它永远不会计算其结果。

要解决此问题,您有两种选择:

  1. 如果您不希望能够取消future,请更改futureToListenSettableFuture然后有谁取消future也叫futureToListen.set(file)
  2. 如果您确实希望能够取消future,请更改futureToListenAbstractFuture(a)公开的set()(以便您可以执行我在(1)中建议的操作)和(b)实施interruptTask()要调用的future.cancel()

还有其他可能的聪明的解决方案,包括一旦未成功future完成就触发工作,但是我不确定我是否建议这样做。对于使用“已取消”作为“工作已成功完成”的信号,我个人感到有些紧张这是因为,例如,还可以通过执行程序关闭来取消。(另一个原因:您需要小心区分“在执行过程中引发异常”和“被取消”。)由于这个原因,我建议的解决方案被设置为直接调用而不是触发任何取消。未来。FutureFutureset()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将ListenableScheduledFuture <Void>转换为ListenableFuture <SomethingElse>

来自分类Dev

无法将'void(MyClass :: *)()'转换为'void(*)()

来自分类Dev

将std :: function <void()>转换为void(*)()

来自分类Dev

将 void (*)() 转换为 void (*)(unsigned char)

来自分类Dev

将int转换为void *

来自分类Dev

C:将void(*)(void *)转换为void(*)(char *)

来自分类Dev

将const char **转换为void *?

来自分类Dev

将Swift结构转换为UnsafeMutablePointer <Void>

来自分类Dev

将void *转换为动态类型

来自分类Dev

将void函数转换为char * C ++

来自分类Dev

将QString转换为const void *

来自分类Dev

将void *转换为int并返回

来自分类Dev

无法将void转换为ICommand

来自分类Dev

将int函数转换为void *

来自分类Dev

将void函数转换为char * C ++

来自分类Dev

是否可以将void *转换为char **?

来自分类Dev

将void *转换为动态类型

来自分类Dev

无法将void转换为double

来自分类Dev

将static void *强制转换为NSObject *

来自分类Dev

将void *转换为int并返回

来自分类Dev

将void *强制转换为struct *

来自分类Dev

将 null 转换为 void 数组

来自分类Dev

将 void* 转换为其他类型

来自分类Dev

如何将 void[] 转换为 U[]

来自分类Dev

将地址转换为函数:使用“ void * void”

来自分类Dev

无法将void转换为java.lang.Void

来自分类Dev

将void(__ cdecl MyClass :: *)()转换为void *时出错

来自分类Dev

如何将“ void(MyClass :: *)(int)”转换为“ void(*)(int)”?

来自分类Dev

将void(__ cdecl MyClass :: *)()转换为void *时出错