ในบทเรียนนี้ เราจะทำความคุ้นเคยกับคลาส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();
คุณสามารถแนบวัตถุใดก็ได้กับคีย์เพื่อติดตามในอนาคต สามารถทำได้ระหว่างการลงทะเบียนช่อง (ผ่านอาร์กิวเมนต์ที่สาม) หรือใหม่กว่า:
-
ปุ่ม SelectionKey = channel.register (ตัวเลือก, SelectionKey.OP_ACCEPT, วัตถุ);
-
key.attach (วัตถุ);
หลังจากนั้น คุณจะได้รับวัตถุที่แนบมาจากคีย์:
Object object = key.attachment();
บทสรุป
หลังจากลงทะเบียนช่องด้วยตัวเลือก เราสามารถ:
- ค้นหาจำนวนช่องสัญญาณที่พร้อมดำเนินการตามที่ระบุ
- บล็อกการทำงานของโปรแกรมของเราจนกว่าอย่างน้อยหนึ่งช่องจะพร้อม
- รับชุดกุญแจสำหรับช่องพร้อม
- และอื่น ๆ
ในตอนท้ายของโมดูลที่สอง เราจะลองใช้ตัวเลือกในทางปฏิบัติ
GO TO FULL VERSION