1. semaphore
มาพูดถึง Semaphore ก่อน Semaphore สามารถควบคุมจำนวนทรัพยากรที่สามารถเข้าถึงได้พร้อมกันรับใบอนุญาตผ่าน Acquire () รอถ้าไม่มีและปล่อย () ปล่อยใบอนุญาต โดยทั่วไปจะใช้ในการควบคุมจำนวนเธรดพร้อมกันและการยกเว้นซึ่งกันและกันระหว่างเธรด นอกจากนี้ reentrantlock ยังสามารถใช้ฟังก์ชั่นนี้ได้ แต่การใช้งานมีความซับซ้อนมากขึ้น
ฟังก์ชั่นนี้คล้ายกับทั้ง 5 หลุมในห้องน้ำ ถ้า 10 คนต้องเข้าห้องน้ำแล้วกี่คนที่สามารถไปเข้าห้องน้ำในเวลาเดียวกันได้? ในเวลาเดียวกันมีเพียง 5 คนเท่านั้นที่สามารถครอบครองได้ เมื่อมีคนห้าคนเคลื่อนไหวคนหนึ่งใน 5 คนที่รออยู่สามารถครอบครองมันได้ นอกจากนี้ในบรรดา 5 คนที่รอพวกเขาจะได้รับโอกาสสำคัญโดยสุ่มหรือพวกเขาอาจได้รับโอกาสในการมาก่อนแล้วมาถึง
วัตถุเซมาฟอร์เดี่ยวสามารถใช้ฟังก์ชันของ mutex และสามารถรับได้โดยหนึ่งเธรดและปล่อยโดยเธรดอื่น สิ่งนี้สามารถนำไปใช้ในบางกรณีของการกู้คืนการหยุดชะงัก
ตัวอย่าง:
/** * @description: * @param @param args * @return เป็นโมฆะประเภทคืน */โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// เธรดพูล ExecutorService Exec = Executors.newCachedThreadPool (); // มีเพียง 5 เธรดที่สามารถเข้าถึง Semaphore สุดท้าย semp = semaphore ใหม่ (5); // จำลองการเข้าถึงไคลเอนต์ 20 สำหรับ (int index = 0; ดัชนี <20; index ++) {สุดท้าย int no = index; runnable run = new runnable () {public void run () {ลอง {// รับอนุญาต semp.acquire (); System.out.println ("รับการเข้าถึง:" + ไม่); thread.sleep ((ยาว) (math.random () * 10,000)); // หลังจากเข้าถึงให้ปล่อย semp.release (); System.out.println ("เหลืออยู่ สัญญาณ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ผลลัพธ์ผลลัพธ์ (คิดว่าทำไมเอาต์พุตเช่นนี้):
ได้รับการเข้าถึง: 1 ได้รับการเข้าถึง: 5 การเข้าถึง: 2 ได้รับการเข้าถึง: 3 การเข้าถึงการเข้าถึง: 0 ที่เหลืออยู่ สัญญาณ-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 13 สัญญาณที่เหลืออยู่ - -
2. ใช้ท่อเป็นสะพานเชื่อมระหว่างเธรด
Pipe มีช่องแหล่งที่มาและช่องสัญญาณอ่างล้างจาน ข้อมูลจะถูกเขียนไปยังช่อง Sink และอ่านจากช่องแหล่งที่มา หนึ่งในและหนึ่งออก ก่อนอื่นมาเรียนรู้วิธีใช้
เป็นที่น่าสังเกตว่าภายใต้ java.nio.channels คลาสนี้ระบุว่าวิธีการสื่อสารข้อมูลของวิธี NIO ใช้ดังนั้นใช้บัฟเฟอร์กับข้อมูลบัฟเฟอร์
ภาพประกอบของหลักการท่อ:
ท่อเป็นท่อเปล่า ปลายด้านหนึ่งของท่อเปล่านี้สามารถอ่านได้จากด้านในของท่อและปลายอีกด้านสามารถเขียนลงในท่อได้
กระบวนการดำเนินการ:
1. ก่อนอื่นต้องมีวัตถุที่จะเขียนลงในหลอดว่างนี้ จะเขียนที่ไหน? ท่อว่างเปล่านี้มีพื้นที่ว่างเล็กน้อยในท่อนี้
เมื่อเขียนมันจะถูกเขียนลงในพื้นที่ที่มีอยู่ในท่อเอง ขนาดพื้นที่นี้คือ 1024 ไบต์
2. วัตถุอื่นสามารถอ่านเนื้อหาของหลอดที่เต็มไปด้วย
บนรหัส
แพ็คเกจ com.jx.test; นำเข้า java.io.ioexception; นำเข้า java.nio.bytebuffer; นำเข้า java.nio.channels.pipe; คลาสสาธารณะ testpipe {/** * @description: * @param @param args * @return ท่อท่อไปป์ไลน์ = pipe.open (); ท่อสุดท้าย sinkchannel psic = pipe.sink (); // ในการเขียนข้อมูลไปยังไปป์ไลน์คุณต้องเข้าถึงช่องสัญญาณ Sink Final Pipe.sourcechannel PSOC = pipe.source (); // จากการอ่านข้อมูลของท่อ {system.out.println ("ส่ง ...... "); // สร้างเธรดและใช้ท่อพอร์ตการเขียนของท่อ SinkChannel พิมพ์ PSIC เพื่อเขียนเนื้อหาของ bytebuffer ที่ระบุลงในท่อ int res = psic.write (bytebuffer .wrap. res);} catch (exception e) {e.printstacktrace ();}}}; thread tpreader = Thread ใหม่ () {public void run () {int bbuffersize = 1024 * 2; bytebuffer bbuffer = bytebuffer.allocate (bbuffersize) ของท่อไปป์ไลน์ SourceChannel ประเภท PSOC เพื่ออ่านเนื้อหาในไปป์ไลน์ลงใน Bytebuffer int res = psoc.read (bbuffer); // ข้อมูลไม่ใช่ system.out.println ("ขนาดที่ได้รับ:"+res+"เนื้อหา:" {E.printStackTrace ();}}}; tpwriter.start (); tpreader.start ();}/***byteBuffer-> ฟังก์ชั่นการแปลงสตริง*/สตริงคงที่สาธารณะ byteBufferToString content.remaining ())) {system.out.println ("ไม่มีอยู่หรือเนื้อหาว่างเปล่า!"); return null;} int contentsize = content.limit () - เนื้อหา. remaining (); stringbuffer resultstr = new StringBuffer (); ResultStr.toString ();}}สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับตัวอย่างของการเขียนโปรแกรมการสื่อสารระหว่างเธรดและรหัสเซมาฟอร์ในบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!