ตัวอย่างนี้แชร์รหัสการใช้งานของพูลเธรดที่เขียนด้วยลายมือ Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
1. พูลเธรดเป็นรูปแบบของมัลติเธรด ในระหว่างการประมวลผลงานจะถูกเพิ่มเข้าไปในคิวจากนั้นงานเหล่านี้จะเริ่มต้นขึ้นโดยอัตโนมัติหลังจากสร้างเธรด เธรดสระว่ายน้ำเป็นเธรดพื้นหลังทั้งหมด
2. สถาปัตยกรรมสระว่ายน้ำแบบง่าย
3. รหัสพูลเธรดแบบง่าย (การปรับเปลี่ยนตนเอง)
นำเข้า java.util.list;/** * อินเตอร์เฟสเธรด * * @author yjian * @date 14:49 2017/10/14 **/อินเตอร์เฟสสาธารณะ Ithreadpool {// เพิ่มงานโมฆะ // เพิ่มโมฆะงาน Execute (Runnable [] งาน); // เพิ่มโมฆะงาน Execute (รายการ <Runnable> งาน); // ทำลายเธรดโมฆะทำลาย ();} นำเข้า java.util.linkedlist; นำเข้า java.util.list; นำเข้า java.util.concurrent.atomic.atomiclong;/** * คลาสการใช้งานเธรด (การใช้งานง่าย ๆ ithreadpool {// จำนวนเธรดถูกเปิดใช้งานโดยค่าเริ่มต้น int int arder_number = 5; // จำนวนเธรดที่เสร็จสมบูรณ์คือ Int ที่ระเหยได้คงที่ sumcount = 0; // รายการคิวงานไม่ปลอดภัยกับเธรดและสามารถปรับให้เหมาะสมกับรายการสแตติก BlockingQueue <Runnable> taskQueue = ใหม่ LinkedList <Runnable> (); // เธรด WorkGroup WorkerThread [] WorkThreads; // atomic atomiclong threadnum = new Atomiclong (); threadpoolimpl threadpool แบบคงที่; // วิธีการก่อสร้าง public threadpoolimpl () {this (worker_number); } public threadpoolimpl (int workernum) {this.worker_number = workernum; // พัฒนา Worker Thread Space WorthThreads = new WorkerThread [worker_number]; // เริ่มสร้างเธรดคนงานสำหรับ (int i = 0; i <worker_number; i ++) {workThreads [i] = new WorkerThread (); เธรดเธรด = เธรดใหม่ (workThreads [i], "ThreadPool-Worker" + threadNum.incrementAndget ()); System.out.println ("เริ่มต้นจำนวนเธรด" + (i + 1) + "----------- ชื่อเธรดปัจจุบัน:" + thread.getName ()); thread.start (); }} @Override สตริงสาธารณะ toString () {return "จำนวนเธรดคนงานคือ" + worker_number + "จำนวนงานที่เสร็จสมบูรณ์" + sumcount + "จำนวนงานรอ" + taskqueue.size (); } // รับเธรดพูลสาธารณะ ithreadpool getThreadPool () {return getThreadPool (worker_number); } สาธารณะคงที่ ithreadpool getThreadpool (int workernum) {// ความผิดพลาดความผิดพลาดถ้าน้อยกว่าหรือเท่ากับ 0 จำนวนเธรดเริ่มต้นคือถ้า (workernum <= 0) {workerNum = worker_number; } if (threadpool == null) {threadpool = new ThreadPoolImpl (workerNum); } return threadpool; } @Override โมฆะสาธารณะดำเนินการ (งาน runnable) {ซิงโครไนซ์ (taskqueue) {taskqueue.add (งาน); taskqueue.notifyall (); }} @Override โมฆะสาธารณะดำเนินการ (Runnable [] งาน) {ซิงโครไนซ์ (taskqueue) {สำหรับ (งานที่ทำงานได้: งาน) {taskqueue.add (งาน); } taskqueue.notifyall (); }} @Override โมฆะสาธารณะดำเนินการ (รายการ <Runnable> งาน) {ซิงโครไนซ์ (taskqueue) {สำหรับ (งานที่ทำงานได้: งาน) {taskqueue.add (งาน); } taskqueue.notifyall (); }} @Override โมฆะสาธารณะทำลาย () {// งานอยู่ที่ยังคงอยู่ในลูปหากมีเวลาการประมวลผล 20 มิลลิวินาทีในขณะที่ (! taskqueue.isempty ()) {ลอง {thread.sleep (20); } catch (interruptedException e) {e.printStackTrace (); }} // หากคิวงานได้รับการประมวลผลทำลายเธรดและล้างงานสำหรับ (int i = 0; i <worker_number; i ++) {workThreads [i] .setWorkerFlag (); workThreads [i] = null; } threadPool = null; taskqueue.clear (); } // สร้างคลาสพูลคนงาน WorkerThread ขยายเธรด {// ใช้เพื่อระบุเธรดปัจจุบันเป็นของบูลีนส่วนตัวสถานะที่มีอยู่ @Override โมฆะสาธารณะ Run () {runnable runnable = null; // อย่าวนซ้ำในขณะที่ (isrunning) {// non-thread-safe ดังนั้นซิงโครไนซ์ (taskqueue) {ในขณะที่ (isrunning && taskqueue.isempty ()) {ลอง {// ถ้าคิวงานว่างเปล่ารองานฟัง 20 มิลลิวินาที } catch (exception e) {e.printstacktrace (); }} // คิวงานจะไม่ว่างเปล่าถ้า (! taskqueue.isempty ()) {runnable = taskqueue.remove (0); // รับงานแรก}} ถ้า (runnable! = null) {runnable.run (); } sumcount ++; runnable = null; }} // ทำลายเธรดโมฆะสาธารณะ setWorkerFlag () {isrunning = false; - นำเข้า java.util.arraylist; นำเข้า java.util.list;/** * คลาสทดสอบ * * @author yjian * @date 15:37 2017/10/14 **/คลาสสาธารณะ Threadpooltest {public Static Void Main (String [] args) {// รายการ <runnable> taskList = arrayList ใหม่ <runnable> (); สำหรับ (int i = 0; i <100; i ++) {taskList.add (งานใหม่ ()); } // ดำเนินการงาน t.execute (tasklist); System.out.println (t); // ทำลายเธรด t.destroy (); System.out.println (t); } งานคลาสคงที่ใช้งานได้ {{private static static ระเหยง่าย int i = 1; @Override โมฆะสาธารณะ Run () {System.out.println ("เธรดที่ประมวลผลในปัจจุบัน:" + thread.currentthread (). getName () + "Execute Task" + (i ++) + "เสร็จสมบูรณ์"); -หลังจากศึกษาซอร์สโค้ดฤดูใบไม้ผลิให้ตรวจสอบอย่างระมัดระวังว่ารูปแบบที่ใช้กันทั่วไปในสปริงจะใช้รหัส ข้อมูลจำเพาะสำหรับการเขียนโปรแกรมควรเป็นเช่นเดียวกับฤดูใบไม้ผลิ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น