ตัวอย่างต่อไปนี้ส่วนใหญ่จะพูดคุยสองประเด็น:
คำถามที่ 1. พูลเธรดได้รับการแก้ไขขนาดโดยสมมติว่าเป็น 5 แล้วเอฟเฟกต์การทำงานของการใส่ 10 เธรดลงในพูลเธรดเป็นอย่างไร? สถานะของเธรดอื่น ๆ ?
คำถามที่ 2 คุณจะลบเธรดออกจากพูลเธรดได้อย่างไรหรือจะแม่นยำเพื่อสร้างเธรดเธรดที่ไม่ได้ใช้งานได้อย่างไร
ตัวอย่าง:
แพ็คเกจ com.dada.executorservice; นำเข้า java.util.concurrent.timeUnit; คลาสสาธารณะ JobThread ขยายเธรด {// ตั้งชื่อเธรดสาธารณะ JobThread (ชื่อสตริง, threadId ยาว) {super (ชื่อ); } @Override โมฆะสาธารณะเรียกใช้ () {// ถ้าเธรดหลักมีเธรดนี้มันจะทำงานในขณะที่ (mainthread.threadnameMap.containskey (this.getName ()))) {ลอง {system.out.println ("ชื่อเธรด: ------" TimeUnit.seconds.sleep (4); } catch (exception e) {e.printstacktrace (); }} system.out.println ("****************************** ชื่อเธรดชื่อ: *************" + this.getName ()); - แพ็คเกจ com.dada.executorservice; นำเข้า java.util.hashmap; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า java.util.concurrent.timeUnit; คลาสสาธารณะ MainThread {สาธารณะคงที่ int final threadpool_size = 5; // สร้างพูลพูลขนาดคงที่สาธารณะ executorService exec = executors.newFixedThreadPool (threadpool_size); // แผนที่ที่ใช้ในการจัดเก็บชื่อเธรดแผนที่คงที่ <สตริงสตริง> threadNamemap = ใหม่ hashmap <สตริงสตริง> (); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// แทรก 10 เธรดลงในพูลเธรด แต่พูลเธรดอนุญาตให้สูงสุด 5 เธรดดังนั้นอีก 5 เธรดอีก 5 เธรดกำลังรอ (int i = 0; i <threadpool_size+5; i ++) {String ThreadName = getThreadName threadnamemap.put (threadname, threadname); exec.execute (ใหม่ JobThread (threadname, i)); } system.out.println ("ขนาดของตารางแฮช:" + Threadnamemap.size ()); ลอง {system.out.println ("เธรดหลักนอนสักพัก!"); TimeUnit.seconds.sleep (3); } catch (exception e) {e.printstacktrace (); System.out.println ("Wake Up!"); } // สิ่งต่อไปนี้ใช้เพื่อลบเธรดในพูลเธรด // removethread (0); // removethread (1); // removethread (2); } โมฆะคงที่สาธารณะ removeThread (int i) {threadnamemap.remove (getThreadName (i)); System.out.println ("ลบ ThreadThread" + i + "ขนาดของตารางแฮช:" + threadnamemap.size ()); } สตริงคงที่สาธารณะ getThreadName (int i) {return "threadName"+i; - เรียกใช้ผลลัพธ์รหัสโดยตรง:
threadname: ------ threadname0
ขนาดของตารางแฮช: 10
นอนสักพักบนด้ายหลัก!
threadname: ------ threadname2
threadname: ------ threadname4
threadname: ------ threadname1
threadname: ------ threadname3
threadname: ------ threadname4
threadname: ------ threadname2
threadname: ------ threadname3
threadname: ------ threadname1
threadname: ------ threadname0
threadname: ------ threadname1
threadname: ------ threadname3
threadname: ------ threadname0
threadname: ------ threadname4
threadname: ------ threadname2
threadname: ------ threadname1
threadname: ------ threadname3
threadname: ------ threadname4
สรุปแล้ว:
พบพิมพ์: ชื่อเธรดมาจาก ThreadName0 ถึง ThreadName4 ไม่มีชื่ออื่น
ได้รับการพิสูจน์แล้วว่า 10 เธรดถูกวางลงในพูลเธรด แต่ขนาดของพูลเธรดคือ 5 และมีเพียง 5 เธรดเท่านั้นที่สามารถจัดสรร CPU การวิ่งเป็นครั้งแรกที่ใส่ลงในพูลเธรดและเธรดอื่น ๆ อยู่ในสถานะพร้อม (สถานะการบล็อก)
หลังจากลบความคิดเห็นรหัสจะทำงาน:
threadname: ------ threadname0
threadname: ------ threadname2
threadname: ------ threadname4
ขนาดของตารางแฮช: 10
นอนสักพักบนด้ายหลัก!
threadname: ------ threadname1
threadname: ------ threadname3
ลบเธรด Thread0 ขนาดของตารางแฮช: 9
ลบ Thread Thread1 ขนาดของตารางแฮช: 8
ลบเธรด 2 ขนาดของตารางแฮช: 7
*************** ปลายเธรดชื่อเธรด: ********* threadname2
*************** ปลายเธรดชื่อเธรด: ********* threadname0
threadname: ------ threadname5
threadname: ------ threadname6
*************** ปลายเธรดชื่อเธรด: ********* threadname1
threadname: ------ threadname4
threadname: ------ threadname7
threadname: ------ threadname3
threadname: ------ threadname6
threadname: ------ threadname5
threadname: ------ threadname7
threadname: ------ threadname4
threadname: ------ threadname3
threadname: ------ threadname5
threadname: ------ threadname6
threadname: ------ threadname7
threadname: ------ threadname4
threadname: ------ threadname3
สรุปแล้ว:
จากผลลัพธ์เราจะเห็นได้ว่าก่อนที่จะถอดเธรดเธรดที่รันอยู่นั้นยังคงจากเธรด 0 ถึงเธรด 4 หลังจากถอดเธรดเธรด 0 เธรดใหม่เธรด 3 จะเริ่มทำงานและจะไปที่ threadName7 ตามลำดับ
สรุปมีดังนี้:
1. พูลเธรดได้รับการแก้ไขขนาดโดยสมมติว่าเป็น 5 แล้วเอฟเฟกต์การทำงานของการใส่ 10 เธรดลงในพูลเธรดเป็นอย่างไร? สถานะของเธรดอื่น ๆ ?
. แนวคิดของพูลเธรดคือคุณส่งคำขอไปเรื่อย ๆ แต่มันสามารถจัดการเธรดด้วยโควต้าที่ระบุเท่านั้นและเธรดพิเศษจะรออยู่
ข. เมื่อหนึ่งในเธรดเสร็จสิ้นการประมวลผล (การดำเนินธุรกิจเสร็จสมบูรณ์หรือออกจากขณะที่ลูปออก) พูลเธรดจะออกจากงานโดยอัตโนมัติจากคิวรอและใช้เธรดที่ไม่ได้ใช้งานเพื่อทำงาน พูลเธรดใดในพูลเธรดที่เรียกใช้ควรเป็นไปตามลำดับที่วางไว้
2. ดังนั้นจะลบเธรดออกจากพูลเธรดหรือแม่นยำเพื่อสร้างเธรดเป็นเธรดที่ไม่ได้ใช้งาน?
พูลเธรดไม่สามารถรับหนึ่งในเธรดและฆ่าได้เนื่องจากเธรดหลักโดยใช้พูลเธรดและเธรดที่เปิดโดยเธรดหลักอยู่ในระดับเดียวกันและไม่มีใครมีสิทธิ์ที่จะครองความอยู่รอดของอีกฝ่าย แต่คุณสามารถเปลี่ยนวิธีการและบรรลุเป้าหมายได้อย่างมีไหวพริบ
. เธรดหลักรักษาตารางแฮชที่สามารถเป็นแฮชแมป ค่าคีย์นั้นเป็นไปโดยพลการ แต่ต้องไม่ซ้ำกันและสามารถระบุเธรดได้โดยไม่ซ้ำกัน
ข. เธรดทั้งหมดที่อยู่ในพูลเธรดจะต้องสร้างค่าคีย์แล้วเก็บไว้ใน HashMap นี้
ค. สำหรับเธรดของคลาสลูปเช่นเธรดในขณะที่ (จริง) ต้องมีการเพิ่มเงื่อนไขเพื่อตรวจสอบว่าคีย์ของเธรดนี้มีอยู่ใน HASHMAP ข้างต้นหรือไม่ ออกจากลูปในขณะที่ไม่มีอยู่
d. แม้ว่าเธรดหลักไม่สามารถควบคุมการอยู่รอดของเธรดอื่น ๆ ได้ แต่ก็สามารถวางหรือลบแฮชแมปของตัวเองได้ ณ จุดนี้ตราบใดที่ค่าคีย์ที่สอดคล้องกันของเธรดจะถูกลบออกจาก HashMap เธรดจะออกจากครั้งต่อไปโดยอัตโนมัติในครั้งต่อไป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น