āđƒāļ™āļšāļ—āđ€āļĢāļĩāļĒāļ™āļ™āļĩāđ‰ āđ€āļĢāļēāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļ„āļĨāļēāļŠSelector āļ„āļĨāļēāļŠāļ™āļĩāđ‰āļ­āļĒāļđāđˆāđƒāļ™ āđāļžāđ‡āļ„āđ€āļāļˆ java.nio.channelsāļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļļāļ“āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļ”āđ† āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™ āļ­āđ‡āļ­āļšāđ€āļˆāđ‡āļāļ•āđŒSelector āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļ­āļšāđ€āļˆāļāļ•āđŒ āļŠāđˆāļ­āļ‡ āļŠāļąāļāļāļēāļ“ āļ•āļąāđ‰āļ‡āđāļ•āđˆāļŦāļ™āļķāđˆāļ‡āļĢāļēāļĒāļāļēāļĢāļ‚āļķāđ‰āļ™āđ„āļ›āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™/āđ€āļ‚āļĩāļĒāļ™ āļŊāļĨāļŊ āđāļĨāļ°āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­ āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŦāļ™āļķāđˆāļ‡āļŠāļ•āļĢāļĩāļĄ āđ„āļĄāđˆāđƒāļŠāđˆāļŦāļ™āļķāđˆāļ‡āļŠāļ•āļĢāļĩāļĄāļ•āđˆāļ­āđāļŠāļ™āđ€āļ™āļĨ

āđ€āļĢāļēāļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđ‚āļ”āļĒāđƒāļŠāđ‰ āļ§āļīāļ˜āļĩ āļāļēāļĢāđ€āļ›āļīāļ” āđāļšāļšāļ„āļ‡āļ—āļĩāđˆ :

Selector selector = Selector.open();

āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāđˆāļ­āļ‡āđƒāļ™āļ§āļąāļ•āļ–āļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ:

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

āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ­āļ‡āļ‚āļ­āļ‡āđ€āļĄāļ˜āļ­āļ”āļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒāļˆāļ°āļāļģāļŦāļ™āļ”āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļĩāđˆāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļš āļŦāļēāļāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĄāļ­āļ™āļīāđ€āļ•āļ­āļĢāđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ bitwise āļŦāļĢāļ·āļ­:

SelectionKey.OP_READ | SelectionKey.OP_WRITE

āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ I/O āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļāļąāļšāļŠāđˆāļ­āļ‡āđƒāļ”āđ† āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļˆāļ°āđāļˆāđ‰āļ‡āđƒāļŦāđ‰āđ€āļĢāļēāļ—āļĢāļēāļš āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđāļŦāļĨāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļ™āļ§āļ™āļĄāļēāļāđ„āļ”āđ‰

āļ—āļĩāđˆāļ™āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļžāļđāļ”āļ–āļķāļ‡āļ§āđˆāļēāļŠāđˆāļ­āļ‡āļ•āđ‰āļ­āļ‡āļ­āļĒāļđāđˆāđƒāļ™āđ‚āļŦāļĄāļ”āđ„āļĄāđˆāļ›āļīāļ”āļāļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļāļąāļšāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ:

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

āļ•āļēāļĄāļĄāļēāļ§āđˆāļēāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļˆāļ°āđ„āļĄāđˆāļ—āļģāļ‡āļēāļ™āļāļąāļšFileChannelāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļFileChannelāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™āđ‚āļŦāļĄāļ”āđ„āļĄāđˆāļšāļĨāđ‡āļ­āļāđ„āļ”āđ‰ ( āđ€āļĄāļ˜āļ­āļ” configurationBlockingāļ–āļđāļāļ›āļĢāļ°āļāļēāļĻāđƒāļ™ āļ„āļĨāļēāļŠ SelectableChannelāļ‹āļķāđˆāļ‡FileChannelāđ„āļĄāđˆāļŠāļ·āļšāļ—āļ­āļ”)

āļˆāļēāļāđāļœāļ™āļ āļēāļž āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļ‹āļĩāđ€āļĨāđ‡āļāđ€āļ•āļ­āļĢāđŒāđ€āļŦāļĄāļēāļ°āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļāļąāļšāđ€āļ•āđ‰āļēāļĢāļąāļš āđ€āļĢāļēāļˆāļ°āļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļšāļžāļ§āļāđ€āļ‚āļēāđ€āļĄāļ·āđˆāļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļŠāļ­āļ‡

SelectionKey

āđ€āļĄāļ·āđˆāļ­āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāđˆāļ­āļ‡āļ”āđ‰āļ§āļĒāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšSelectionKeyāļ§āļąāļ•āļ–āļļ. āļ­āđ‡āļ­āļšāđ€āļˆāđ‡āļāļ•āđŒāļ™āļĩāđ‰āļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđāļŠāļ™āđ€āļ™āļĨ

āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ›āļļāđˆāļĄāđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļ§āđˆāļēāļŠāđˆāļ­āļ‡āļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļ„āđˆāļēāđƒāļ”āļ„āđˆāļēāļŦāļ™āļķāđˆāļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆ:

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

āļ›āļļāđˆāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āļŠāđˆāļ­āļ‡āđāļĨāļ°āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđāļāđˆāļ„āļļāļ“āđ„āļ”āđ‰:

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

āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđāļ™āļšāļ§āļąāļ•āļ–āļļāđƒāļ”āļāđ‡āđ„āļ”āđ‰āļāļąāļšāļ„āļĩāļĒāđŒāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āļēāļĄāđƒāļ™āļ­āļ™āļēāļ„āļ• āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāđˆāļ­āļ‡ (āļœāđˆāļēāļ™āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāļ™āļ•āđŒāļ—āļĩāđˆāļŠāļēāļĄ) āļŦāļĢāļ·āļ­āđƒāļŦāļĄāđˆāļāļ§āđˆāļē:

  1. āļ›āļļāđˆāļĄ SelectionKey = channel.register (āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ, SelectionKey.OP_ACCEPT, āļ§āļąāļ•āļ–āļļ);

  2. key.attach (āļ§āļąāļ•āļ–āļļ);

āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™ āļ„āļļāļ“āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ§āļąāļ•āļ–āļļāļ—āļĩāđˆāđāļ™āļšāļĄāļēāļˆāļēāļāļ„āļĩāļĒāđŒ:

Object object = key.attachment();

āļšāļ—āļŠāļĢāļļāļ›

āļŦāļĨāļąāļ‡āļˆāļēāļāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāđˆāļ­āļ‡āļ”āđ‰āļ§āļĒāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–:

  • āļ„āđ‰āļ™āļŦāļēāļˆāļģāļ™āļ§āļ™āļŠāđˆāļ­āļ‡āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ•āļēāļĄāļ—āļĩāđˆāļĢāļ°āļšāļļ
  • āļšāļĨāđ‡āļ­āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āđ€āļĢāļēāļˆāļ™āļāļ§āđˆāļēāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒāļŦāļ™āļķāđˆāļ‡āļŠāđˆāļ­āļ‡āļˆāļ°āļžāļĢāđ‰āļ­āļĄ
  • āļĢāļąāļšāļŠāļļāļ”āļāļļāļāđāļˆāļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ­āļ‡āļžāļĢāđ‰āļ­āļĄ
  • āđāļĨāļ°āļ­āļ·āđˆāļ™ āđ†

āđƒāļ™āļ•āļ­āļ™āļ—āđ‰āļēāļĒāļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļŠāļ­āļ‡ āđ€āļĢāļēāļˆāļ°āļĨāļ­āļ‡āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđƒāļ™āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļī