網上有很多大佬已經寫過了這個響應式流的原理,這里就不在說明了。
網上查了很多大多數都是基于jdk9實現,但公司還在用jdk8,所以就自己研究了一下,分享給大家,共同學習。
官網:http://www.reactive-streams.org
github:https://github.com/reactive-streams/reactive-streams-jvm/tree/v1.0.4
這個包之定義了響應式流接口,并在jdk9時加入到了jdk中,在jdk9中對接口進行了代碼的實現,所以在jdk9之后可以直接使用(封裝的真好,使用很方便)
,但在jdk8及之前的版本想要使用響應式流就要引入這個包并自己實現接口。
這里寫了一個小demo用于練習理解響應式流
導入reactive-streams這個包
maven
<dependency>
<groupId>org.reactivestreams</groupId>
<artifactId>reactive-streams</artifactId>
<version>1.0.4</version>
</dependency>
jar包提供了4個接口和1個jdk9及以上的適配器
class org.reactivestreams.FlowAdapters
interface org.reactivestreams.Processor
interface org.reactivestreams.Publisher
interface org.reactivestreams.Subscriber
interface org.reactivestreams.Subscription
1、創建用于傳輸的類
public class User {
private Integer id;
private String name;
// 有參構造
public User(Integer id, String name){
this.id = id;
this.name = name;
}
// 省略 get set 方法
}
2、創建訂閱中心 UserSubscription
public class UserSubscription implements Subscription {
public static final ConcurrentLinkedQueue<User> inbound = new ConcurrentLinkedQueue<>();
private Subscriber subscriber;
public UserSubscription(Subscriber subscriber){
this.subscriber = subscriber;
}
@Override
public void request(long l) {
new Thread(() -> {
User user = inbound.poll();
subscriber.onNext(user);
}).start();
}
@Override
public void cancel() {
System.out.println("【訂閱者】取消訂閱");
}
}
3、創建發布者 UserPublisher
public class UserPublisher implements Publisher<User> {
@Override
public void subscribe(Subscriber<? super User> subscriber) {
subscriber.onSubscribe(new UserSubscription(subscriber));
}
public void submit(User user){
UserSubscription.inbound.offer(user);
System.out.println("【發布者】發布消息:{id:"+user.getId()+", name:"+user.getName()+"}");
}
}
4、創建訂閱者 UserSubscriber
public class UserSubscriber implements Subscriber<User> {
private Subscription subscription;
/**
* 初始化Subscription,并且表示可以開始接受訂閱數據了
* @param subscription
*/
@Override
public void onSubscribe(Subscription subscription) {
this.subscription = subscription;
System.out.println("【訂閱者】訂閱成功");
// 訂閱者必須發送需求信號,才能接受onNext信號
subscription.request(1); //這里只接受一個數據元素
}
/**
* 接受下一項訂閱數據的回調方法
* @param user
*/
@Override
public void onNext(User user) {
boolean flag = true;
if(user != null){
while(flag){
System.out.println("【訂閱者】接受數據:{id:"+user.getId()+", name:"+user.getName()+"}");
flag = false;
}
}
this.subscription.request(1);
}
/**
* 在Publisher或Subscriber遇到不可恢復的錯誤時調用此方法,Subscriber不在接受訂閱消息
*
* 不得調用Subscription或Publisher上的任何方法
* 目的時防止在處理完成信號期間發生Subscription或Publisher之間的周期競爭條件
* 如果收到此信號必須考慮取消訂閱
* 目的只確保Subscriber遵從Subscription信號狀態。在收到onError信號后,訂閱就失效
* @param throwable
*/
@Override
public void onError(Throwable throwable) {
System.out.println("【訂閱者】出現異常");
this.subscription.cancel();
}
/**
* 當接受完所有訂閱數據,并且發布者已經關閉后會回調這個方法
*
* 不得調用Subscription或Publisher上的任何方法
* 目的時防止在處理完成信號期間發生Subscription或Publisher之間的周期競爭條件
* 如果收到此信號必須考慮取消訂閱
* 目的只確保Subscriber遵從Subscription信號狀態。在收到onComplete信號后,訂閱就失效
*/
@Override
public void onComplete() {
System.out.println("【訂閱者】數據接受完成");
this.subscription.cancel();
}
}
5、main方法
public class UserMain {
public static void main(String[] args) throws Exception {
// 1、創建發布者
UserPublisher publisher = new UserPublisher();
// 2、創建訂閱者
UserSubscriber subscriber = new UserSubscriber();
// 3、發布者和訂閱者建立訂閱關系
publisher.subscribe(subscriber);
// 4、發布者發布消息
for(int i = 0; i < 10; i++){
publisher.submit(new User(i, "wpixel"));
Thread.sleep(1000);
}
}
}
6、Console
【訂閱者】訂閱成功
【發布者】發布消息:{id:0, name:wpixel}
【訂閱者】接受數據:{id:0, name:wpixel}
【訂閱者】接受數據:{id:1, name:wpixel}
【發布者】發布消息:{id:1, name:wpixel}
【發布者】發布消息:{id:2, name:wpixel}
【訂閱者】接受數據:{id:2, name:wpixel}
【發布者】發布消息:{id:3, name:wpixel}
【訂閱者】接受數據:{id:3, name:wpixel}
【發布者】發布消息:{id:4, name:wpixel}
【訂閱者】接受數據:{id:4, name:wpixel}
【發布者】發布消息:{id:5, name:wpixel}
【訂閱者】接受數據:{id:5, name:wpixel}
【發布者】發布消息:{id:6, name:wpixel}
【訂閱者】接受數據:{id:6, name:wpixel}
【發布者】發布消息:{id:7, name:wpixel}
【訂閱者】接受數據:{id:7, name:wpixel}
【發布者】發布消息:{id:8, name:wpixel}
【訂閱者】接受數據:{id:8, name:wpixel}
【發布者】發布消息:{id:9, name:wpixel}
【訂閱者】接受數據:{id:9, name:wpixel}
作者是一名自由程序員,住在杭州,喜歡音樂、小說、旅行、以及編程。
P.S. 如果您喜歡這篇文章并且希望學習編程技術的話,請關注一下