Computer >> Máy Tính >  >> Lập trình >> Java

Làm thế nào chúng ta có thể triển khai giao diện Người đăng ký trong Java 9?


Java 9 hỗ trợ tạo Luồng phản ứng bằng cách giới thiệu một vài giao diện: Publisher , Người đăng ký , Đăng ký SubmissionPublisher lớp triển khai Publisher giao diện. Mỗi giao diện có thể đóng một vai trò khác nhau tương ứng với các nguyên tắc của Phản ứng Luồng .

Chúng tôi có thể sử dụng Người đăng ký giao diện để đăng ký dữ liệu được xuất bản bởi nhà xuất bản . Chúng tôi cần triển khai Người đăng ký giao diện và cung cấp một triển khai cho các phương thức trừu tượng.

Phương thức giao diện Flow.Subscriber:

  • onComplete (): Phương thức này đã được gọi khi đối tượng Publisher hoàn thành vai trò của nó.
  • onError (): Phương thức này đã được gọi khi có sự cố xảy ra trong Publisher và được thông báo cho Người đăng ký.
  • onNext (): Phương thức này được gọi bất cứ khi nào Nhà xuất bản có thông tin mới cần được thông báo cho tất cả Người đăng ký.
  • onSubscribe (): Phương thức này đã được gọi khi Nhà xuất bản thêm Người đăng ký.

Ví dụ

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

Đầu ra

Subscribed
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9
Processing 10
Processing done
Done