如何在Java 9中實現Subscriber介面?
Java 9 支援透過引入幾個介面來建立響應式流:Publisher、Subscriber、Subscription 和實現Publisher 介面的SubmissionPublisher 類。每個介面都可以根據響應式流的原則扮演不同的角色。
我們可以使用Subscriber 介面來訂閱由釋出者釋出的資料。我們需要實現Subscriber 介面併為抽象方法提供實現。
Flow.Subscriber 介面方法
- onComplete():當Publisher物件完成其角色時,呼叫此方法。
- onError():當Publisher出現錯誤並通知Subscriber時,呼叫此方法。
- onNext():每當Publisher有新的資訊需要通知所有Subscriber時,呼叫此方法。
- onSubscribe():當Publisher新增Subscriber時,呼叫此方法。
示例
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
import java.util.stream.IntStream;
public class SubscriberImplTest {
public static class Subscriber implements Flow.Subscriber<Integer> {
private Flow.Subscription subscription;
private boolean isDone;
@Override
public void onSubscribe(Flow.Subscription subscription) {
System.out.println("Subscribed");
this.subscription = subscription;
this.subscription.request(1);
}
@Override
public void onNext(Integer item) {
System.out.println("Processing " + item);
this.subscription.request(1);
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("Processing done");
isDone = true;
}
}
public static void main(String args[]) throws InterruptedException {
SubmissionPublisher<Integer> publisher = new SubmissionPublisher<>();
Subscriber subscriber = new Subscriber();
publisher.subscribe(subscriber);
IntStream intData = IntStream.rangeClosed(1, 10);
intData.forEach(publisher::submit);
publisher.close();
while(!subscriber.isDone) {
Thread.sleep(10);
}
System.out.println("Done");
}
}輸出
Subscribed Processing 1 Processing 2 Processing 3 Processing 4 Processing 5 Processing 6 Processing 7 Processing 8 Processing 9 Processing 10 Processing done Done
廣告
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP