java9 响应式编程支持

简介: java9中的响应式编程

概述

java9开始,官方支持了响应式编程规范,提供了顶级的响应式编程接口。
java11开始,官方提供了支持http2的、友好的http客户端java.net.http,该客户端就是jdk内部第一个基于响应式编程规范的实现。

响应式编程接口

package java.util.concurrent;
//这是Flow API的主要类。该类封装了Flow API的所有重要接口。这是一个final类,我们不能扩展它。
public final class Flow {

    private Flow() {} // uninstantiable
    //发布者
    @FunctionalInterface
    public static interface Publisher<T> {
        public void subscribe(Subscriber<? super T> subscriber);
    }
    //订阅者
    public static interface Subscriber<T> {
        //这是订阅者订阅了发布者后接收消息时调用的第一个方法
        public void onSubscribe(Subscription subscription);
        public void onNext(T item);
        public void onError(Throwable throwable);
        public void onComplete();
    }
    
    public static interface Subscription {
        public void request(long n);
        public void cancel();
    }
    //此接口同时扩展了Publisher和Subscriber接口,用于在发布者和订阅者之间转换消息。
    public static interface Processor<T,R> extends Subscriber<T>, Publisher<R> {
    }
    static final int DEFAULT_BUFFER_SIZE = 256;

    public static int defaultBufferSize() {
        return DEFAULT_BUFFER_SIZE;
    }
}

该响应式接口规范与reactor中的基本一致,每个接口及方法含义请参考 reactor3 源码分析

demo

这里我们只是简单演示一下。借用SubmissionPublisher作为发布者。

import java.util.Arrays;
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
import java.util.concurrent.TimeUnit;

public class Java9FlowTest {
    public static class MySubscriber<T> implements Flow.Subscriber<T> {
        private Flow.Subscription subscription;

        @Override
        public void onSubscribe(Flow.Subscription subscription) {
            this.subscription = subscription;
            subscription.request(1); //这里要使用Long.MAX_VALUE就会被认为获取无穷的数据。
        }
        @Override
        public void onNext(T item) {
            System.out.println("Got : " + item);
            subscription.request(1);
        }
        @Override
        public void onError(Throwable t) {
            t.printStackTrace();
        }
        @Override
        public void onComplete() {
            System.out.println("Done");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SubmissionPublisher<Integer> publisher = new SubmissionPublisher<>();

        //注册订阅者
        MySubscriber<Integer> subscriber = new MySubscriber<>();
        publisher.subscribe(subscriber);

        //发布信息
        for(int i = 0 ; i < 10 ; i ++){
            publisher.submit(i);
            TimeUnit.SECONDS.sleep(1);
        }
        publisher.close();

        TimeUnit.SECONDS.sleep(100);//为了等待结束
    }
}

输出结果

Got : 0
Got : 1
Got : 2
Got : 3
Got : 4
Done
相关文章
|
7月前
|
SQL JSON Java
Java 15功能特性
Java是一门广泛使用的编程语言,具有强大的生态系统和稳定的版本演进历史。在Java 15中,引入了一些令人兴奋的新功能特性,为开发人员提供了更多便利和灵活性。本文将介绍Java 15的几个重要功能特性。
94 0
|
5月前
|
存储 安全 Java
学习Java的高级特性
学习Java的高级特性是成为一名优秀的Java开发者的必备知识。在本文中,我们将深入探讨泛型、注解、反射和Lambda表达式这些高级特性,并提供相应的Java代码示例。
|
7月前
|
安全 Cloud Native Java
Java 17 功能特性介绍
Java 17 是 Java 编程语言的最新版本,它引入了许多令人振奋的功能和改进。本篇技术博客将为您介绍 Java 17 的一些主要功能特性,帮助您更好地了解这个版本的新变化。
304 3
|
7月前
|
存储 并行计算 安全
Java 16:功能特性详解
Java 16 是 Java 编程语言的最新版本,它带来了一些令人兴奋的功能和改进。本文将介绍 Java 16 中的几个重要特性。
55 0
|
8月前
|
Oracle Java 关系型数据库
Java 12 功能特性
Java 12 是Oracle在2019年发布的一项重要更新,它引入了许多令人兴奋的功能特性和改进。本文将介绍其中一些值得关注的特性。
47 0
|
8月前
|
XML 设计模式 前端开发
day32_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!虽然有些干货知识很通俗,但也是自己的必经之路i
|
8月前
|
缓存 Java Spring
day30_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!
|
8月前
|
设计模式 Java 数据库
day31_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!虽然有些干货知识很通俗,但也是自己的必经之路i
|
8月前
|
Java Spring 容器
day29_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!
|
8月前
|
存储 缓存 Java
day28_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!