Flux<Long> interval = Flux.interval(Duration.ofSeconds(1)) 怎样停止interval

如何停止 Flux.interval() 创建的间隔流

在Reactor框架中,Flux.interval(Duration duration) 方法用于创建一个每隔指定时间发射一次信号的数据流。默认情况下,这个数据流是无限的,会持续发送新的值,直到被显式地终止。

要停止这样一个无限流,可以通过管理订阅(Subscription)来实现。以下是详细的步骤:

1. 创建并订阅间隔流

首先,创建一个Flux.interval(),然后订阅它:

Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));
interval.subscribe();

这里,Duration.ofSeconds(1) 表示每隔一秒钟发射一个新的值。

2. 捕获订阅对象

在订阅时,可以通过Reactor提供的操作符(如 doOnSubscribe())来捕获订阅对象:

Subscription subscription = null;

Flux<Long> interval = Flux.interval(Duration.ofSeconds(1))
    .doOnSubscribe(s -> {
        subscription = s;
    });

interval.subscribe();

这样,在订阅时,会将Subscription对象赋值给变量subscription

3. 停止间隔流

当需要停止数据流时,调用 Subscription.cancel() 方法:

if (subscription != null) {
    subscription.cancel();
    subscription = null; // 防止重复取消
}

这样,订阅会被终止,不再发射新的值。

完整示例代码

以下是一个完整的示例,展示了如何启动和停止一个间隔流:

import reactor.core.publisher.Flux;
import reactor.core.subscription.Subscription;

public class IntervalExample {

    private Subscription subscription;

    public void startInterval() {
        Flux<Long> interval = Flux.interval(Duration.ofSeconds(1))
            .doOnSubscribe(s -> {
                this.subscription = s;
            });

        interval.subscribe();
    }

    public void stopInterval() {
        if (subscription != null) {
            subscription.cancel();
            subscription = null;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        IntervalExample example = new IntervalExample();

        // 启动间隔流
        example.startInterval();
        System.out.println("Interval started.");

        // 等待5秒后停止
        Thread.sleep(5000);
        example.stopInterval();
        System.out.println("Interval stopped.");
    }
}
运行结果

运行上述代码,你将看到如下输出:

Interval started.
[每隔一秒打印一次Long值]
Interval stopped.

在第5秒时,间隔流被停止,不再发送新的值。

注意事项

  1. 及时取消订阅:确保在不需要数据流时调用cancel()方法,以释放资源。
  2. 空检查:在调用cancel()之前,最好进行空检查,避免出现空指针异常。
  3. 线程安全:如果在多线程环境下操作订阅对象,请考虑使用线程安全的方式管理Subscription

通过以上方法,你可以轻松地控制由Flux.interval()创建的无限流的生命周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值