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);
}
}