Flux流如何打断

    public static void main(String[] args) {
        // 模拟每一秒输出一个字的流
        Flux<String> letterFlux = Flux.create(sink -> {
            for (int i = 0; i < 30; i++) {
                char letter = (char) ('A' + (int) (Math.random() * 26));
                sink.next(String.valueOf(letter));
                try {
                    Thread.sleep(1000); // 每秒输出一个字母
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            sink.complete();
        });

        AtomicReference<Disposable> innerDisposable = new AtomicReference<>();
        Consumer<FluxSink<String>> consumer = emitter -> {
            Disposable disposable = letterFlux.doOnNext(element -> {
                        emitter.next(element);
                        System.out.println("内部接受数据:" + element);
                    })
                    .doOnCancel(() -> System.out.println("内部取消订阅"))
                    .subscribeOn(Schedulers.boundedElastic())
                    .subscribe();
            innerDisposable.set(disposable);
        };
        Flux<String> flux = Flux.create(consumer);

        // 线程1,打印和记录订阅
        AtomicReference<Disposable> outerDisposable = new AtomicReference<>();
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " start");
            Disposable disposable = flux
                    .publishOn(Schedulers.boundedElastic())
                    .doOnNext(element -> System.out.println("外部接受数据:" + element))
                    .doOnCancel(() -> System.out.println("外部取消订阅"))
                    .subscribe();
            outerDisposable.set(disposable);
            System.out.println("disposable:" + disposable.isDisposed());
        }).start();

        // 线程2,5秒后取消订阅
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " start");
            try {
                Thread.sleep(5000); // 每秒输出一个字母
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            // 取消底层订阅
            innerDisposable.get().dispose();
            // 取消上层订阅
            outerDisposable.get().dispose();
        }).start();

        try {
            Thread.sleep(30000); // 每秒输出一个字母
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
posted @ 2026-04-07 17:28  月下小魔王  阅读(9)  评论(0)    收藏  举报