โพสต์บล็อกก่อนหน้านี้สรุปเนื้อหาบางส่วนในการพร้อมกันของ Java โพสต์บล็อกนี้ส่วนใหญ่เริ่มต้นด้วยปัญหาและดูว่าเทคโนโลยีพร้อมกันที่สรุปไว้ข้างต้นสามารถใช้เพื่อแก้ปัญหาได้
จำลองสถานการณ์: การประมวลผลบันทึกบันทึก 16 บันทึกแต่ละครั้งเวลาการพิมพ์บันทึกบันทึกใช้เวลา 1 วินาที ภายใต้สถานการณ์ปกติหากบันทึกทั้ง 16 รายการเหล่านี้เสร็จสิ้นจะใช้เวลา 16 วินาที เพื่อปรับปรุงประสิทธิภาพเราพร้อมที่จะเริ่มต้น 4 เธรดเพื่อพิมพ์และพิมพ์ใน 4 วินาทีเพื่อตระหนักถึงการสาธิตนี้
มาวิเคราะห์คำถามนี้ก่อน เกี่ยวกับบันทึกบันทึก 16 บันทึกเหล่านี้เราสามารถสร้างได้ในเธรดหลัก นี่ไม่ใช่เรื่องยาก กุญแจสำคัญคือการเริ่มต้น 4 เธรดเพื่อดำเนินการ มีสองแนวคิดในขณะนี้: หนึ่งคือการสร้างบันทึกและเธรดที่พิมพ์บันทึกจะถูกแยกอย่างมีเหตุผล; อีกอย่างคือการสร้างบันทึกและเธรดที่พิมพ์บันทึกจะไม่แยกกันอย่างมีเหตุผล นี่อาจจะคลุมเครือเล็กน้อย ให้ฉันเขียนตัวอย่างที่ใช้งานตามแนวคิดสองประการนี้
การสร้างบันทึกและการพิมพ์บันทึกแยกกันอย่างมีเหตุผล
สิ่งนี้เทียบเท่ากับสองด้าน: ด้านหน้าด้านหน้ากำลังสร้างบันทึกอย่างต่อเนื่องและอีกด้านหนึ่งอยู่ด้านหน้าคือการพิมพ์บันทึกอย่างต่อเนื่อง เห็นได้ชัดว่าคุณจะนึกถึงการใช้คิวการปิดกั้นและสร้างบันทึกที่เชื่อมต่อเข้ากับคิวการปิดกั้นและพิมพ์บันทึกที่ได้รับจากคิวการบล็อก ขนาดของคิวการบล็อกสามารถตั้งค่าได้ด้วยตัวเอง 16 หรือ 1 ซึ่งไม่ส่งผลกระทบต่อการดำเนินการ ดังนั้นจะใช้บล็อกคิวลองมาดูการสาธิตที่ดำเนินการด้านล่าง:
การฝึกฝนระดับสาธารณะ 1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// กำหนดคิวการปิดกั้นขนาดคิวสามารถมี 16 ข้อมูลการปิดกั้น <string> queue = arrayblockingqueue ใหม่ <String> (16); สำหรับ (int i = 0; i <4; i ++) run () {ในขณะที่ (จริง) {ลอง {String log = queue.take (); // รับ log parselog (log); // print log} catch (interruptedexception e) {// toDo todo generated catch blocke.printstacktrace ();}}}}) (System.currentTimemillis ()/1000)); สำหรับ (int i = 0; i <16; i ++) {สตริงสุดท้าย log = "" +(i +1); // ระบุบันทึกลอง {queue.put (log); blocke.printstacktrace ();}}} โมฆะคงที่สาธารณะ parselog (บันทึกสตริง) {// เมธอดสำหรับการพิมพ์ระบบบันทึก. out.println (เธรด. 1 วินาที} catch (interruptedException e) {// toDo catch blocke.printstacktrace ();}}}}} นี่เป็นเหมือนระบบที่ใช้งานสร้างบันทึกอย่างต่อเนื่องและเปิดหลายเธรดอย่างต่อเนื่องเพื่อพิมพ์ข้อมูลบันทึก การสาธิตถูกเขียนและผลการดำเนินการไม่ได้โพสต์
การสร้างบันทึกและการพิมพ์บันทึกไม่ได้แยกกันอย่างมีเหตุผล
ความคิดนี้คือเมื่อฉันสร้างบันทึกคุณพิมพ์ออกมาให้ฉันและทำด้วยสี่เธรดด้วยกัน! ดังนั้นหากคุณคิดแบบนี้คุณต้องใช้พูลเธรด ฉันสร้างพูลเธรดครั้งแรกซึ่งมี 4 เธรดจากนั้นเมื่อบันทึกถูกสร้างขึ้นฉันขอให้พูลเธรดใช้เธรดเพื่อดำเนินการ การสาธิตมีดังนี้:
การฝึกฝนระดับสาธารณะ 1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ExecutorService Service = Executors.newFixedThreadPool (4); // สร้างระบบสระว่ายน้ำของเธรด OUT.println ("เริ่มต้น:" +(system.currentTimeMillis ()/1,000); สำหรับ (int i = 0; log service.execute (ใหม่ runnable () {// ใช้เธรดเพื่อดำเนินการ @Override โมฆะสาธารณะเรียกใช้ () {parselog (log);}});} service.shutdown (); // อย่าลืมปิดพูลเธรดในตอนท้าย + "---" + (system.currenttimeMillis ()/1000)); ลอง {thread.sleep (1,000); // จำลองการพิมพ์บันทึกใช้เวลา 1 วินาที} จับ (interruptedException e) {// toDoมาสรุปปัญหานี้ที่นี่ หากคุณเข้าใจความคิดทั้งสองนี้โดยทั่วไปคุณสามารถแก้ปัญหาได้อย่างมีประสิทธิภาพ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการเขียนโปรแกรม Java ด้วยรหัสตัวอย่างปัญหามัลติเธรดฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!