ในบทเรียนนี้ เราจะทำความคุ้นเคยกับคลาส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();

บทสรุป

หลังจากลงทะเบียนช่องด้วยตัวเลือก เราสามารถ:

  • ค้นหาจำนวนช่องสัญญาณที่พร้อมดำเนินการตามที่ระบุ
  • บล็อกการทำงานของโปรแกรมของเราจนกว่าอย่างน้อยหนึ่งช่องจะพร้อม
  • รับชุดกุญแจสำหรับช่องพร้อม
  • และอื่น ๆ

ในตอนท้ายของโมดูลที่สอง เราจะลองใช้ตัวเลือกในทางปฏิบัติ