โหมดเธรดต่อข้อความ (งานนี้เหลือให้คุณ)
เมื่อคุณยุ่งมากมี บริษัท จัดส่งสินค้าชั้นล่างของ บริษัท ดังนั้นคุณจึงมอบความไว้วางใจให้เพื่อนร่วมงานของคุณเพื่อช่วยให้คุณได้รับบริการจัดหาเพื่อให้คุณสามารถทำงานต่อไปได้
ในโหมดเธรดต่อข้อความจุดสิ้นสุดตัวแทนของข้อความและปลายการดำเนินการเป็นเธรดที่แตกต่างกัน ผู้แทนของข้อความจะบอกเธรดการดำเนินการสิ้นสุดและงานนี้จะมอบให้คุณ
คลาสโฮสต์:
คลาสที่สร้างเธรดสำหรับการร้องขอส่วนใหญ่โดยการเปิดเธรดใหม่โทรไปที่มือจับผู้ช่วยและส่งข้อความที่จะพิมพ์
โฮสต์ชั้นเรียนสาธารณะ {ตัวช่วยผู้ช่วยภาคเอกชน = new Helper (); คำขอโมฆะสาธารณะ (จำนวน int สุดท้าย, ถ่านสุดท้าย c) {system.out.println ("ขอเริ่มต้น"); เธรดใหม่ () {โมฆะสาธารณะเรียกใช้ () {helper.handle (count, c);}}.}.};ผู้ช่วยชั้นเรียน:
ให้ฟังก์ชั่นการแสดงตัวอักษรวิธีการจำลองเวลาการพิมพ์ช้าๆ
ผู้ช่วยระดับสาธารณะ {มือถือโมฆะสาธารณะ (จำนวน int, char c) {system.out.println ("จัดการวิธีการเริ่มต้น"); สำหรับ (int i = 0; i <count; i ++) {ช้า (); system.out.print (c);} system.out.println (""); system.out. {thread.sleep (100);} catch (interruptedexception e) {// todo catch blocke.printstacktrace ();}}}}}ชั้นหลัก:
สร้างอินสแตนซ์ของโฮสต์และเรียกวิธีการร้องขอ
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("หลักเริ่มต้น"); โฮสต์โฮสต์ = โฮสต์ใหม่ (); host.request (10, 'a'); host.request (20, 'b'); host.request (30, 'c'); system.out.println ("main end");ผลการทดสอบ:
เริ่มต้นหลัก
วิธีการร้องขอเริ่มขึ้นแล้ว
จุดสิ้นสุดของวิธีการร้องขอ
วิธีการร้องขอเริ่มขึ้นแล้ว
จุดสิ้นสุดของวิธีการร้องขอ
วิธีการร้องขอเริ่มขึ้นแล้ว
จุดสิ้นสุดของวิธีการร้องขอ
จุดจบ
เริ่มต้นวิธีการจัดการ
เริ่มต้นวิธีการจัดการ
เริ่มต้นวิธีการจัดการ
Bacbacbacbacbacbacbacba
จุดสิ้นสุดของวิธีการจัดการ
CBCBCBCBCBCBCBCBCBCBCBCBCBCBCB
จุดสิ้นสุดของวิธีการจัดการ
CCCCCCCCCCC
จุดสิ้นสุดของวิธีการจัดการ
จากผลลัพธ์ของการดำเนินการเราจะเห็นว่าวิธีการร้องขอไม่รอวิธีการจัดการที่จะดำเนินการก่อนการดำเนินการ แต่เรียกใช้วิธีการจัดการและกลับไปยังวิธีการร้องขอจนกว่าการวิ่งจะสิ้นสุด ดังนั้นจึงเทียบเท่ากับวิธีการร้องขอที่ผ่านการทำงานของการพิมพ์อักขระจำนวนหนึ่งที่จะดำเนินการกับวิธีการจัดการและวิธีการร้องขอสามารถเรียกใช้คำสั่งอื่น ๆ ในวิธีโง่ ๆ โดยไม่ต้องรอวิธีการจัดการให้เสร็จสมบูรณ์ สิ่งนี้ยังบอกเราว่าเมื่องานบางอย่างใช้เวลานานเธรดใหม่สามารถเริ่มต้นในโหมดนี้เพื่อทำการประมวลผล โหมดนี้สามารถนำไปใช้กับเซิร์ฟเวอร์ซึ่งสามารถลดเวลาตอบสนองของเซิร์ฟเวอร์
อธิบายกระบวนการและเธรด:
ความแตกต่างที่ใหญ่ที่สุดระหว่างเธรดและกระบวนการคือการอยู่ร่วมกันของหน่วยความจำหรือไม่
แต่ละกระบวนการมีพื้นที่หน่วยความจำอิสระของตัวเอง กระบวนการไม่สามารถอ่านและเขียนหน่วยความจำของกระบวนการอื่นโดยไม่ได้รับอนุญาต เนื่องจากพื้นที่หน่วยความจำของกระบวนการเป็นอิสระจากกันกระบวนการไม่จำเป็นต้องกังวลเกี่ยวกับการถูกทำลายโดยกระบวนการอื่น
เธรดสามารถอยู่ร่วมกันได้ เธรดหนึ่งเขียนเนื้อหาไปยังอินสแตนซ์และเธรดอื่น ๆ สามารถอ่านเนื้อหาของอินสแตนซ์ได้ เนื่องจากหลายเธรดสามารถเข้าถึงอินสแตนซ์เดียวกันได้เราจึงต้องตรวจสอบให้แน่ใจว่ามันทำงานได้อย่างถูกต้อง
การเพิ่มประสิทธิภาพการออกแบบโฮสต์:
1. ออกแบบคลาสโฮสต์โดยใช้อินเทอร์เฟซ ThreadFactory ภายใต้แพ็คเกจ java.util.concurrent
โฮสต์ชั้นเรียนสาธารณะ {คำขอโมฆะสาธารณะ (จำนวน int สุดท้าย, Final Char C) {System.out.println ("วิธีการขอเริ่มต้น"); ThreadFactory.newThread (ใหม่ runnable () {@Overridepublic void run () {// // toDo วิธีการที่สร้างขึ้นอัตโนมัติ สิ้นสุด ");}}วัตถุอินสแตนซ์โฮสต์ที่สอดคล้องกัน:
โฮสต์โฮสต์ = โฮสต์ใหม่ (executors.defaultthreadFactory ());
ข้อได้เปรียบของการออกแบบนี้คือรหัสอินสแตนซ์ดั้งเดิมที่สร้างขึ้นด้วยใหม่ขึ้นอยู่กับคลาส java.lang เธรดและไม่สามารถควบคุมส่วนของเธรดการสร้างได้และสามารถนำกลับมาใช้ใหม่ได้น้อยกว่า หากมีการใช้ ThreadFactory เพื่อบันทึกวัตถุของคลาสที่เกี่ยวข้องและเรียกใช้วิธีการใหม่เพื่อสร้างเธรดใหม่การสร้างเธรดจะรับรู้ สิ่งนี้ไม่ได้ขึ้นอยู่กับคลาสเธรดอีกต่อไป แต่ขึ้นอยู่กับวัตถุ ThreadFactory ที่ส่งผ่านในตัวสร้างซึ่งใช้รายละเอียดของการควบคุมการสร้างเธรด
ออกแบบคลาสโฮสต์ใหม่โดยใช้อินเตอร์เฟส java.util.concurrent.executor:
อินเทอร์เฟซ ThreadFactory ก่อนหน้านี้ซ่อนรายละเอียดของการสร้างเธรด แต่ไม่ซ่อนการดำเนินการสร้างเธรด หากมีการใช้อินเทอร์เฟซ Executor การดำเนินการสร้างเธรดจะถูกซ่อนไว้
โฮสต์ชั้นเรียนสาธารณะ {ตัวช่วยตัวสุดท้ายส่วนตัว = new Helper (); Executor ผู้บริหารระดับสุดท้ายส่วนตัว; โฮสต์สาธารณะ (ผู้ดำเนินการ Executor) {this.executor = Executor;} คำขอโมฆะสาธารณะ (จำนวน int สุดท้าย วิธีการที่สร้างโดยอัตโนมัติ stubhelper.handle (count, c);}}); system.out.println ("วิธีการขอสิ้นสุด");}}สร้างขึ้นโดยใช้ Java.util.concurrent.scheduledexecutorservice Class ซึ่งสามารถใช้การดำเนินการตามกำหนดเวลา
โฮสต์ชั้นเรียนสาธารณะ {ตัวช่วยผู้ช่วยส่วนตัว = ผู้ช่วยใหม่ (); ส่วนตัวสุดท้าย scheduledExecutorservice ScheduleDexecutorservice; โฮสต์สาธารณะ (ScheduleDexecutorservice ScheduleDexecutorservice) {this.ScheduledExecutorService = ScheduleDexecutorservice; เริ่มต้น "); scheduleDexecutorservice.schedule (ใหม่ runnable () {@Overridepublic void run () {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stubhelper.handle (count, c);}}, 3l, timeunit.seconds); ระบบทดสอบรายการฟังก์ชันหลัก:
ScheduleDexecutorservice ScheduleDexecutorService = Executors.NewsCheduledThreadPool (5) โฮสต์โฮสต์ = โฮสต์ใหม่ (ScheduleDexecutorService); ลอง {host.request (10, 'a'); host.rquest (20, 'b'); host.request (30, '); blocke.printstacktrace ();} ในที่สุด {scheduleDexecutorservice.shutdown (); System.out.println ("Main End");}สรุป
บทบาทของลูกค้าเรียกใช้วิธีการร้องขอของบทบาทโฮสต์และการประมวลผลจริงของคำขอจะถูกส่งมอบให้กับผู้ช่วยสำหรับการดำเนินการ อย่างไรก็ตามหากไคลเอนต์เรียกใช้วิธีการจัดการโดยตรงจากคำขอจะไม่สามารถส่งคืนจากวิธีการจัดการได้จนกว่าการดำเนินการจริงจะสิ้นสุดลง สิ่งนี้จะลดประสิทธิภาพการตอบกลับของคำขอ ดังนั้นบทบาทของโฮสต์จะเริ่มเธรดใหม่ที่ใช้ในการประมวลผลคำขอจากบทบาทไคลเอนต์และปล่อยให้เธรดเรียกด้ามจับเพื่อให้เธรดทำให้คำขอสามารถส่งคืนจากที่จับได้ทันที นี่คือโหมดเธรดต่อข้อความ