当前位置: 首页 > 知识库问答 >
问题:

将ListenableScheduledFuture转换为ListenableFuture < something other >

朱和惬
2023-03-14

我希望得到您对以下问题和解决方案(潜在)的反馈。

假设有一个可运行的任务,该任务对 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 DOC1,取消futureToListen将导致我们的任务被取消。

问题:

>

  • 因为任务结果无效,所以如上所示强制转换为ListenableschduledFuture是否有意义?

    将返回void的任务的未来转换为某种类型的未来在语义上有意义吗?

    有没有更好更优雅的解决方案?用Java8的CompletableFuture会不会更好?

  • 共有1个答案

    满才
    2023-03-14

    < code>transform可能不会如您所愿。您提到取消< code>futureToListen将取消< code>future,这是事实。问题是储备也是如此:当< code>future被取消时,< code>futureToListen也会被取消。这意味着它永远不会计算结果。

    要解决此问题,您有几个选择:

    1. 如果您不在乎能否取消未来,请将futureToListen。然后让取消future的人也拨打futureToListen.set(file)
    2. 如果您确实想取消future,那么请将futureToListen,它(a)公开0.05()

    还有其他可能的聪明的解决方案,包括每当< code>future不成功地完成时触发工作,但是我不确定我是否推荐这样做。我个人对使用“< code>Future被取消”作为“工作成功完成”的信号感到有点紧张这是因为< code>Future也可能会被取消,例如,执行程序关闭。(另一个原因是:你需要小心区分“执行过程中抛出异常”和“被取消”)由于这个原因,我建议的解决方案设置为直接调用< code>set(),而不是触发未来的任何取消。

     类似资料:
    • 问题内容: 我正在开发一些应用程序,它允许从SD卡中选择图像,将其保存到数据库中并为ImageView设置此值。我需要知道将uri转换为字符串并将字符串转换为uri的方法。现在,我使用了Uri的getEncodedPath()方法,但是例如,此代码不起作用: 因此,我不知道如何将Uri保存到数据库中并根据保存的值创建新的Uri。请帮我修复它。 问题答案: 我需要知道将uri转换为字符串并将字符串转

    • 我正在努力将图像标记转换为链接并复制标记内的参数,即。 进入 我的问题不仅仅是复制src和alt数据,还包括丢失和额外的标记。 进入 和 进入 这需要对整个字符串中img标记的所有实例执行。 不是说听起来像是一个挑战,但是有人能提出一个可能的解决方案吗,我相信这可以用preg_replace但是我就是做不到? 非常感谢。

    • 最近,我浏览了一些网站,将中缀转换成前缀符号,最后我被卷了起来。 我已经给出了我所做的步骤。。 例:-(1(2*3))(5*6)(7/8) 方法1:-(无需任何算法的手动转换):- 方法2:- 根据现场情况http://scanftree.com/Data_Structure/infix-to-prefix 所以,在这里我完全被绞死了。 请任何人提供以下方面的信息:- 关于我在以上2种方法中哪里出

    • 问题内容: 如何从float转换为string或从string转换为float? 在我的情况下,我需要在2个值字符串(我从表中获得的值)和我计算出的浮点值之间进行断言。 我尝试从浮动到字符串: 但是断言失败 问题答案: 使用Java的类。 为了进行比较,将字符串转换为float并比较两个float总是更好。这是因为对于一个浮点数,存在多个字符串表示形式,与字符串相比,它们是不同的(例如“ 25”!

    • 我们正在获取具有以下字段的订单数据(仅显示相关字段) 具有NULLoriginal_orderid的订单可以被认为是父订单 其中一些父母订单可能有子订单,子订单的original_orderid映射到父母的订单。 子顺序可以产生另一个子顺序,如图像所示,带有颜色编码。 与原始文本相同的数据: 作为转换,我们需要将所有子节点映射到它们的原始父节点(original_orderid为NULL),并获得

    • 问题内容: 有没有一种简单的方法可以避免处理文本编码问题? 问题答案: 您确实无法避免处理文本编码问题,但是Apache Commons中已有一些解决方案: 至: 至: 您只需要选择所需的编码即可。