เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้และศึกษาการใช้มัลติเธรด Java เมื่อทำการเพิ่มประสิทธิภาพรหัสแล้วสรุปหลังจากอ่านข้อมูลเชิงลึกของมือใหม่
1. สืบทอดคลาสเธรดเพื่อใช้มัลติเธรด
แม้ว่าวิธีการที่สืบทอดคลาสเธรดจะถูกระบุว่าเป็นวิธีการใช้งานแบบมัลติเธรดเธรดนั้นเป็นอินสแตนซ์ของอินเตอร์เฟส Runnable ซึ่งแสดงถึงอินสแตนซ์ของเธรดและวิธีเดียวที่จะเริ่มเธรดคือวิธีการเริ่มต้น () ของคลาสเธรด วิธีการเริ่มต้น () เป็นวิธีการดั้งเดิมที่จะเริ่มเธรดใหม่และดำเนินการวิธีการเรียกใช้ () วิธีนี้ง่ายมากในการใช้มัลติเธรด โดยการขยายเธรดโดยตรงผ่านคลาสของคุณเองและเขียนเมธอด Run () อีกครั้งคุณสามารถเริ่มเธรดใหม่และดำเนินการวิธีการเรียกใช้ () ที่คุณกำหนด ตัวอย่างเช่น:
ชั้นเรียนสาธารณะ MyThread ขยายเธรด {โมฆะสาธารณะ Run () {System.out.println ("mythread.run ()"); - เริ่มเธรดในสถานที่ที่เหมาะสมดังนี้:
MYTHREAD MYTHREAD1 = ใหม่ MYTHREAD (); MYTHREAD MYTHREAD2 = ใหม่ MYTHREAD (); MYTHREAD1.START (); Mythread2.start ();
2. ใช้อินเทอร์เฟซ Runnable เพื่อใช้งานมัลติเธรดมัลติเธรด
หากคลาสของคุณขยายคลาสอื่นแล้วคุณไม่สามารถขยายเธรดได้โดยตรง ในเวลานี้คุณต้องใช้อินเทอร์เฟซที่รันได้ดังนี้:
คลาสสาธารณะ MyThread ขยายการใช้งานอื่น ๆ ที่ใช้งานได้ {โมฆะสาธารณะเรียกใช้ () {System.out.println ("mythread.run ()"); - ในการเริ่มต้น MyThread คุณต้องยกตัวอย่างเธรดก่อนและส่งผ่านในอินสแตนซ์ของคุณเองในตำนานของคุณเอง:
MYTHREAD MYTHREAD = NEW MYTHREAD (); เธรดเธรด = เธรดใหม่ (MyThread); thread.start ();
ในความเป็นจริงเมื่อพารามิเตอร์เป้าหมายที่เรียกใช้ได้ถูกส่งผ่านไปยังเธรดวิธีการเรียกใช้ () ของเธรดจะเรียก target.run () โปรดดูที่ซอร์สโค้ด JDK:
โมฆะสาธารณะเรียกใช้ () {ถ้า (เป้าหมาย! = null) {target.run (); - 3. ใช้ ExecutorService, Callable และ Future เพื่อให้ได้หลายเธรดด้วยผลลัพธ์การส่งคืน
ExecutorService, Callable และ Future Objects เป็นคลาสที่ใช้งานได้จริงในเฟรมเวิร์ก Executor นี่เป็นคำอธิบายที่ละเอียดมากเกี่ยวกับกรอบงาน เธรดที่ส่งคืนผลลัพธ์เป็นคุณสมบัติใหม่ที่แนะนำใน JDK1.5 มันใช้งานได้จริงมาก ด้วยคุณสมบัตินี้ฉันไม่จำเป็นต้องผ่านปัญหามากมายเพื่อให้ได้ค่าคืนสินค้าและแม้ว่าจะถูกนำไปใช้มันอาจจะเต็มไปด้วยช่องโหว่
งานที่สามารถส่งคืนค่าจะต้องใช้อินเทอร์เฟซ callable และในทำนองเดียวกันงานที่ไม่ส่งคืนค่าจะต้องมีอินเทอร์เฟซ Runnable หลังจากดำเนินการงานที่เรียกได้คุณสามารถรับวัตถุในอนาคตได้ การโทรรับบนวัตถุเพื่อให้วัตถุส่งคืนโดยงานเรียกได้ เมื่อรวมกับ ExecutorService อินเตอร์เฟสของพูลเธรดคุณสามารถตระหนักถึงการทำมัลติเธรดในตำนานด้วยผลการส่งคืน ด้านล่างเป็นตัวอย่างการทดสอบแบบมัลติเธรดที่สมบูรณ์พร้อมผลลัพธ์ที่ส่งคืน หากคุณตรวจสอบภายใต้ JDK1.5 คุณสามารถใช้มันได้โดยตรง รหัสมีดังนี้:
นำเข้า java.util.concurrent.*; นำเข้า java.util.date; นำเข้า java.util.list; นำเข้า java.util.arraylist; / *** เธรดที่มีค่าส่งคืน*/ @suppresswarnings ("ไม่ได้ตรวจสอบ") การทดสอบระดับสาธารณะ {โมฆะสาธารณะคง System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ pool = executors.newFixedThreadPool (Tasksize); System.out.println (">>>" + f.get (). toString ()); // รับผลการทำงานของงานที่เกิดขึ้นพร้อมกันทั้งหมดสำหรับ (Future F: รายการ) {// รับค่าคืนสินค้าของงานจากวัตถุในอนาคตและส่งออกไปยังคอนโซล System.out.println (">>>" + f.get (). toString ()); } วันที่วันที่ 2 = วันที่ใหม่ (); System.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- MyCallable (String tasknum) {this.tasknum = tasknum; DateTmp1.getTime (); รหัสคำอธิบาย:
ในรหัสด้านบนคลาส Executors มีชุดของวิธีการโรงงานสำหรับการสร้างพูลเธรดและพูลเธรดที่ส่งคืนทั้งหมดใช้งานอินเทอร์เฟซ ExecutorService
Public ExecutorService newfixedthreadpool (int nthreads)
สร้างพูลเธรดที่มีจำนวนเธรดคงที่
Public ExecutorService Newcachedthreadpool ()
สร้างพูลเธรดที่แคชได้การเรียกใช้งานจะใช้เธรดที่สร้างขึ้นก่อนหน้านี้อีกครั้ง (หากมีเธรด) หากเธรดที่มีอยู่ไม่พร้อมใช้งานให้สร้างเธรดใหม่และเพิ่มลงในพูล ยุติและลบเธรดออกจากแคชที่ไม่ได้ใช้เป็นเวลา 60 วินาที
Public ExecutorService NewsingLetHreatHreadExecutor ()
สร้างผู้ดำเนินการแบบเธรดเดี่ยว
Public Static ScheduleDexecutorservice NewscheduledThreadpool (int corepoolsize)
สร้างพูลเธรดที่รองรับการดำเนินงานตามเวลาและเป็นระยะซึ่งสามารถใช้ในกรณีส่วนใหญ่แทนที่จะเป็นคลาสจับเวลา
Executoreservice ให้วิธีการส่ง () ผ่านการเรียกที่เรียกได้หรือเรียกใช้และกลับมาในอนาคต หากพูลเธรดพื้นหลังของ Executor ยังไม่เสร็จสิ้นการคำนวณที่เรียกได้การโทรนี้จะส่งคืนวิธีการรับ () ของวัตถุในอนาคตซึ่งจะบล็อกจนกว่าการคำนวณจะเสร็จสมบูรณ์