พูลเธรดคืออะไร
พูลเธรดเป็นคอลเลกชันของเธรดที่ [ลูปดำเนินการ] ตรรกะแอปพลิเคชันหลายตัวในเธรดหนึ่งหรือมากกว่า
โดยทั่วไปแล้วพูลเธรดมีส่วนต่อไปนี้:
หนึ่งเธรดหรือมากกว่าที่ทำภารกิจหลักให้เสร็จสมบูรณ์
หัวข้อการจัดการที่ใช้สำหรับการจัดการการจัดตารางเวลา
คิวงานต้องดำเนินการ
ฟังก์ชั่นของพูลเธรด:
ฟังก์ชั่นของพูลเธรดคือการ จำกัด จำนวนเธรดที่ดำเนินการในระบบ
ขึ้นอยู่กับสภาพแวดล้อมของระบบจำนวนเธรดสามารถตั้งค่าโดยอัตโนมัติหรือด้วยตนเองเพื่อให้ได้เอฟเฟกต์การทำงานที่ดีที่สุด ทรัพยากรระบบน้อยลงจะสูญเปล่าและความแออัดของระบบไม่สูง ใช้พูลเธรดเพื่อควบคุมจำนวนเธรดและเธรดอื่น ๆ กำลังรออยู่ในบรรทัด หลังจากดำเนินการงานแล้วงานแรกจะถูกนำมาจากคิวเพื่อเริ่มดำเนินการ หากไม่มีกระบวนการรออยู่ในคิวทรัพยากรของพูลเธรดกำลังรออยู่ เมื่อต้องทำงานงานใหม่หากมีเธรดคนงานที่รออยู่ในพูลเธรดก็สามารถเริ่มทำงานได้ มิฉะนั้นจะเข้าสู่คิวรอ
ใช้ด้ายพูลด้วยตัวเอง
ขึ้นอยู่กับความเข้าใจด้านบนของพูลเธรดเราเขียนพูลเธรดง่าย ๆ ของเราเอง:
อินเทอร์เฟซพูลเธรดแบบง่าย:
อินเทอร์เฟซ Public ThreadPool <งานขยาย runnable> {// ดำเนินการงาน (งาน) งานนี้จะต้องใช้โมฆะที่เรียกใช้งานได้ (งานงาน); // ปิดการปิดช่องว่างพูลพูล (); // เพิ่มเธรดคนงานนั่นคือเธรดที่ใช้ในการเรียกใช้งาน void addworkers (int num); // ลดโมฆะด้ายคนงาน removeworker (int num); // รับจำนวนงานที่รอการดำเนินการเป็นโมฆะ getJobsize ();}ลูกค้าสามารถส่งงานไปยังพูลเธรดผ่านวิธีการดำเนินการ (งาน) สำหรับการดำเนินการและลูกค้าไม่ต้องรอให้งานถูกดำเนินการเลย นอกเหนือจากวิธีการดำเนินการ (Job) อินเตอร์เฟสพูลเธรดยังให้วิธีการเพิ่ม/ลดเธรดของคนงานและปิดพูลเธรด ลูกค้าแต่ละรายส่งงานที่จะเข้าสู่คิวงานและรอให้เธรดคนงานดำเนินการ
การใช้งานเริ่มต้นของอินเทอร์เฟซพูลเธรด
คลาสสาธารณะ defaultThreadPool <งานขยาย runnable> ใช้ ThreadPool <mob> {// จำนวนเธรดสูงสุดสำหรับด้ายพูลการบำรุงรักษาคนงานเธรดส่วนตัวคงที่ int max_worker_numbers = 10; // ค่าเริ่มต้นของเธรดพูลการบำรุงรักษาคนงานเธรดส่วนตัวคงที่สุดท้าย int default_worker_numbers = 5; // จำนวนขั้นต่ำของด้ายพูลการบำรุงรักษาคนงานเธรดส่วนตัวคงที่สุดท้าย int min_worker_numbers = 1; // รักษารายการงานซึ่งเพิ่มงานที่เกี่ยวข้องกับลูกค้า LinkedList <BOB> jobs = new LinkedList <BOB> (); // รายชื่อของคนงานเธรดรายการสุดท้ายรายการสุดท้าย <Worker> คนงาน = คอลเลกชัน // จำนวนคนงานเธรดส่วนตัว int workernum; // สร้าง atomiclong ส่วนตัว threadNum = new Atomiclong (); // สร้างเธรดพูล public PublicThreadPool () {this.workerNum = default_worker_numbers; ผู้เริ่มต้น (this.workernum); } สาธารณะ defaultThreadPool (int num) {if (num> max_worker_numbers) {this.workernum = default_worker_numbers; } else {this.workernum = num; } ผู้เริ่มต้น (this.workernum); } // เริ่มต้นแต่ละเธรดพนักงานแต่ละคนเป็นโมฆะเริ่มต้นการเริ่มต้น (int num) {สำหรับ (int i = 0; i <num; i ++) {คนงานคนงาน = คนงานใหม่ (); // เพิ่มในรายการของคนงานเธรดคนงาน ADD (คนงาน); // เริ่มเธรดเธรดคนงาน = เธรดใหม่ (คนงาน); thread.start (); }} โมฆะสาธารณะดำเนินการ (งานงาน) {ถ้า (Job! = null) {// ตามหัวข้อ "การรอ/แจ้งเตือน" ของเธรดเราต้องล็อคงานที่ซิงโครไนซ์ (งาน) {jobs.addlast (งาน); Jobs.notify (); }}} // ปิดพูลเธรดที่จะปิดแต่ละคนงานแต่ละคนทำงานเป็นโมฆะสาธารณะ () {สำหรับ (คนงาน W: คนงาน) {W.Shutdown (); }}} // เพิ่มความเป็นโมฆะสาธารณะของคนงานเป็นโมฆะ public addworkers (int num) {// เพิ่มล็อคเพื่อป้องกันไม่ให้เธรดเพิ่มขึ้นหรือทำเสร็จในขณะที่เธรดถัดไปยังคงเพิ่มขึ้นทำให้เธรดคนงานเกินค่าสูงสุดที่ซิงโครไนซ์ } ผู้เริ่มต้น (NUM); this.workernum += num; }} // ลดเธรดคนงานโมฆะสาธารณะ removeworker (int num) {ซิงโครไนซ์ (งาน) {ถ้า (num> = this.workernum) {โยน unlegalargumentException ใหม่ ("เกินจำนวนเธรดที่มีอยู่"); } สำหรับ (int i = 0; i <num; i ++) {คนงานคนงาน = คนงาน. get (i); if (worker! = null) {// ปิดเธรดและลบ worker.shutdown (); คนงานลบ (i); }} this.workernum -= num; }} public int getJobSize () {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub return workers.size (); } // กำหนดชั้นเรียนด้ายคนงานใช้งานใช้งานได้ {// ระบุว่าบูลีนผันผวนส่วนตัวของคนงานทำงานอยู่ = true; โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (กำลังทำงาน) {job job = null; // กลไกการรอคอย/การแจ้งเตือนแบบซิงโครไนซ์ (งาน) {ถ้า (jobs.isempty ()) {ลอง {jobs.wait (); // เธรดรอการปลุก} จับ กลับ; }} // เอางานออกไป = Jobs.RemoveFirst (); } // ดำเนินงานถ้า (Job! = null) {job.run (); }}} // ยกเลิกการปิดการปิดการใช้งานของเธรดสาธารณะ () {running = false; -
จากการใช้งานพูลเธรดจะเห็นได้ว่าเมื่อลูกค้าเรียกวิธีการดำเนินการ (งาน) มันจะเพิ่มงานอย่างต่อเนื่องในงานรายการงานและกระทู้คนงานแต่ละคนจะไม่อ่านงานจากงานเพื่อดำเนินการ เมื่องานว่างเปล่าเธรดคนงานจะเข้าสู่สถานะการรอคอย
หลังจากเพิ่มงานวิธีการแจ้งเตือน () จะถูกเรียกใช้งานคิวงานเพื่อปลุกเธรดคนงาน ที่นี่เราไม่เรียก Notifyall () เพื่อหลีกเลี่ยงการสูญเสียทรัพยากรโดยการย้ายเธรดทั้งหมดในคิวรอไปยังคิวการปิดกั้น
สาระสำคัญของพูลเธรดคือการใช้คิวงานที่ปลอดภัยจากเธรดเพื่อเชื่อมต่อเธรดของคนงานและเธรดไคลเอนต์ เธรดไคลเอ็นต์จะกลับมาหลังจากนำงานเข้าไปในคิวงานในขณะที่เธรดคนงานจะใช้งานจากคิวงานและดำเนินการ เมื่อคิวงานว่างเปล่าเธรดคนงานจะเข้าสู่สถานะการรอคอย เมื่อลูกค้าส่งงานมันจะผ่านเธรดคนงานใด ๆ ด้วยการส่งงานจำนวนมากทำให้กระทู้ของคนงานเพิ่มขึ้น
การอ้างอิง: "ศิลปะการเขียนโปรแกรมพร้อมกันใน Java" Fang Tengfei