Trong bài học này, chúng ta sẽ làm quen với lớp Selector . Lớp này nằm trong gói java.nio.channels , vì vậy bạn không cần tải xuống hoặc định cấu hình bất kỳ thứ gì để sử dụng nó. Đối tượng Bộ chọn có thể giám sát một hoặc nhiều đối tượng Kênh , kiểm tra mức độ sẵn sàng đọc/ghi của chúng, v.v. Và quan trọng nhất, bộ chọn cần một luồng chứ không phải một luồng trên mỗi kênh.

Chúng tôi tạo bộ chọn bằng phương thức mở tĩnh :

Selector selector = Selector.open();

Sau đó, các kênh có thể được đăng ký trong một đối tượng bộ chọn:

SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

Tham số thứ hai của phương thức thanh ghi xác định hoạt động nào mà bộ chọn sẽ giám sát. Nếu bạn cần giám sát nhiều hoạt động cùng một lúc, bạn có thể sử dụng bitwise OR:

SelectionKey.OP_READ | SelectionKey.OP_WRITE

Khi một hành động I/O xảy ra trên bất kỳ kênh nào, bộ chọn sẽ thông báo cho chúng tôi. Bằng cách này, bạn có thể đọc dữ liệu từ nhiều nguồn dữ liệu chẳng hạn.

Ở đây chúng ta cần đề cập rằng một kênh phải ở chế độ không chặn để kênh đó được sử dụng với bộ chọn:

channel1.configureBlocking(false);
channel2.configureBlocking(false);
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

Theo đó, bộ chọn sẽ không hoạt động với FileChannel vì không thể chuyển FileChannel sang chế độ không chặn ( phương thức configureBlocking được khai báo trong lớp SelectableChannelFileChannel không kế thừa).

Từ sơ đồ, bạn có thể thấy rằng các bộ chọn phù hợp để sử dụng với ổ cắm. Chúng ta sẽ làm việc với chúng ở phần cuối của mô-đun thứ hai.

khóa lựa chọn

Khi đăng ký một kênh với bộ chọn, chúng tôi nhận được mộtkhóa lựa chọnsự vật. Đối tượng này chứa dữ liệu về đăng ký kênh.

Bạn có thể sử dụng khóa để xác định xem kênh đã sẵn sàng cho một giá trị nhất định chưa:

key.isReadable()
key.isAcceptable()
key.isConnectable()
key.isWritable()

Phím có thể cung cấp cho bạn kênh và bộ chọn tương ứng:

Channel channel = key.channel();
Selector selector = key.selector();

Bạn có thể đính kèm bất kỳ đối tượng nào vào một khóa để theo dõi nó trong tương lai. Điều này có thể được thực hiện trong quá trình đăng ký kênh (thông qua đối số thứ ba) hoặc sau đó:

  1. Khóa SelectionKey = channel.register(bộ chọn, SelectionKey.OP_ACCEPT, đối tượng);

  2. key.attach(đối tượng);

Sau đó, bạn có thể lấy đối tượng đính kèm từ khóa:

Object object = key.attachment();

Phần kết luận

Sau khi đăng ký kênh với bộ chọn, chúng tôi có thể:

  • tìm ra số lượng kênh sẵn sàng để thực hiện các hoạt động được chỉ định
  • chặn thực thi chương trình của chúng tôi cho đến khi ít nhất một kênh sẵn sàng
  • nhận một bộ khóa cho các kênh đã sẵn sàng
  • và hơn thế nữa

Vào cuối mô-đun thứ hai, chúng tôi sẽ thử các bộ chọn trong thực tế.