เธรดการเปรียบเทียบเธรด java, runnable, callable
Java ใช้คลาสเธรดเพื่อแสดงเธรดและวัตถุฟิลด์ทั้งหมดจะต้องเป็นอินสแตนซ์ของคลาสเธรดหรือคลาสย่อย ฟังก์ชั่นของแต่ละเธรดคือการทำงานให้เสร็จสมบูรณ์ซึ่งจริง ๆ แล้วเป็นการดำเนินการโฟลว์โปรแกรม Java ใช้ Bodies การดำเนินการเธรดเพื่อแสดงการไหลของโปรแกรมนี้
1. สืบทอดคลาสเธรดเพื่อสร้างเธรด
ขั้นตอนในการเริ่มมัลติเธรดมีดังนี้:
(1) กำหนดคลาสย่อยของคลาสเธรดและแทนที่วิธีการเรียกใช้ () ของคลาส วิธีการของวิธีการของวิธีการเรียกใช้ () แสดงถึงงานที่เธรดคลาสจำเป็นต้องทำให้เสร็จสมบูรณ์ ดังนั้นวิธีการเรียกใช้ () จึงเรียกว่าร่างกายการดำเนินการเธรด
(2) สร้างอินสแตนซ์ของคลาสย่อยของเธรดนั่นคือสร้างวัตถุเธรด
(3) เรียกเมธอด Star () ของเธรดเพื่อเริ่มเธรด
รหัสที่เกี่ยวข้องมีดังนี้:
/ *** สืบทอดคลาสชั้นในของเธรดเพื่อซื้อตั๋วตัวอย่างเช่น*/ คลาสสาธารณะ FirstHread ขยายเธรด {private int i; ตั๋ว INT ส่วนตัว = 10; @Override โมฆะสาธารณะ Run () {สำหรับ (; i <20; i ++) {// เมื่อสืบทอดเธรดใช้สิ่งนี้โดยตรงเพื่อรับเธรดปัจจุบัน getName () รับชื่อของเธรดปัจจุบัน // log.d (แท็ก, getName ()+""+i); if (this.ticket> 0) {log.e (แท็ก, getName () + ", การขายตั๋ว: ตั๋ว =" + ตั๋ว-); }}}} โมฆะส่วนตัว starticketThread () {log.d (แท็ก, "starticketThread,"+thread.currentThread (). getName ()); FirstThread Thread1 = new FirstThread (); FirstThread Thread2 = new FirstThread (); FirstThread Thread3 = new FirstThread (); Thread1.start (); Thread2.start (); Thread3.start (); // เปิด 3 เธรดเพื่อซื้อตั๋วแต่ละเธรดขายตั๋ว 10 ใบและตั๋วทั้งหมด 30 ใบ}ผลการทำงาน:
คุณจะเห็นว่าตัวแปรโหวตที่ป้อนโดย 3 เธรดไม่ต่อเนื่อง หมายเหตุ: ตั๋วเป็นคุณสมบัติอินสแตนซ์ของ FirstHread ไม่ใช่ตัวแปรท้องถิ่น แต่เนื่องจากโปรแกรมจำเป็นต้องสร้างวัตถุ FirstHread ทุกครั้งที่สร้างวัตถุเธรดเธรดหลายตัวทั้งหมดไม่แชร์แอตทริบิวต์ของอินสแตนซ์
2. ใช้อินเตอร์เฟส Runnable เพื่อสร้างเธรด
หมายเหตุ: เธรดคลาสสาธารณะใช้งานได้
(1) กำหนดคลาสการใช้งานของอินเทอร์เฟซ Runnable และแทนที่วิธีการเรียกใช้ () ของอินเตอร์เฟส วิธีการของวิธีการของการเรียกใช้ () ยังเป็นส่วนที่ดำเนินการเธรดของเธรด
(2) สร้างอินสแตนซ์ของคลาสอินสแตนซ์ Runnable อินสแตนซ์นี้ใช้เป็นเป้าหมายเธรดเพื่อสร้างวัตถุเธรด วัตถุเธรดเป็นวัตถุจริง
รหัสที่เกี่ยวข้องมีดังนี้:
/ ** * ใช้อินเทอร์เฟซ Runnable และสร้างคลาสเธรด */ คลาสสาธารณะที่ SecondThread ดำเนินการ unnable {private int i; ตั๋ว INT ส่วนตัว = 100; @Override โมฆะสาธารณะ Run () {สำหรับ (; i <20; i ++) {// ถ้าคลาสเธรดใช้อินเทอร์เฟซ runnable // รับเธรดปัจจุบันคุณสามารถใช้ thread.currentthread () เพื่อรับชื่อเธรดปัจจุบัน (แท็ก, เธรด if (this.ticket> 0) {log.e (tag, thread.currentthread (). getName () + ", การขายตั๋ว: ticket =" + ตั๋ว-); }}}} โมฆะส่วนตัว starticketThread2 () {log.d (แท็ก, "starticketThread2,"+thread.currentthread (). getName ()); SecondThread SecondThread = new SecondThread (); // สร้างเธรดใหม่ผ่านเธรดใหม่ (เป้าหมาย, ชื่อ) เธรดใหม่ (SecondThread, "Ticket Buyer 1"). Start (); เธรดใหม่ (SecondThread, "Ticket Buyer 2"). Start (); เธรดใหม่ (SecondThread, "Ticket Buyer 3"). Start (); // แม้ว่าจะเปิด 3 เธรด แต่มีเพียง 100 ใบเท่านั้นที่ซื้อโดยรวม}ผลการทำงาน:
คุณจะเห็นได้ว่าตัวแปรโหวตที่ป้อนโดย 3 เธรดนั้นต่อเนื่องและหลายเธรดสามารถแบ่งปันคุณสมบัติของอินสแตนซ์ของคลาสเธรดโดยใช้อินเตอร์เฟส Runnable นี่เป็นเพราะด้วยวิธีนี้วัตถุ Runnable ที่สร้างโดยโปรแกรมเป็นเพียงเป้าหมายของเธรดและหลายเธรดสามารถแชร์เป้าหมายเดียวกันได้ดังนั้นหลายเธรดสามารถแบ่งปันคุณสมบัติอินสแตนซ์ของคลาสเธรดเดียวกัน (ซึ่งควรเป็นคลาสเป้าหมายของเธรด)
3. สร้างเธรดโดยใช้ callable และอนาคต
เริ่มต้นจาก Java 5 Java ให้อินเทอร์เฟซ callable ซึ่งเป็นเวอร์ชันที่ได้รับการปรับปรุงของ Runnable Callable มีคลาสที่เรียกว่า () วิธีการที่สามารถใช้เป็นตัวดำเนินการเธรด แต่วิธีการโทร () มีประสิทธิภาพมากกว่า
(1) วิธีการโทร () สามารถมีค่าส่งคืน (2) วิธีการโทร () สามารถประกาศข้อยกเว้นที่โยน
ดังนั้นเราสามารถจัดเตรียมวัตถุที่เรียกได้ว่าเป็นเป้าหมายเธรดและผู้ดำเนินการของเธรดคือวิธีการโทร () ของวัตถุที่เรียกได้ ในเวลาเดียวกัน Java 5 จะจัดเตรียมอินเทอร์เฟซในอนาคตเพื่อแสดงค่าส่งคืนของวิธีการโทร () ในอินเทอร์เฟซ callable และให้คลาสการใช้งาน FutureTask คลาสการใช้งานนี้ใช้อินเทอร์เฟซในอนาคตและดำเนินการอินเทอร์เฟซแบบเรียกใช้ - เป้าหมายที่สามารถใช้เป็นคลาสเธรดได้
ขั้นตอนการเริ่มต้นมีดังนี้:
(1) สร้างคลาสการใช้งานของอินเทอร์เฟซที่เรียกได้และใช้เมธอดการโทร () วิธีการโทร () จะถูกใช้เป็นตัวดำเนินการของเธรดและวิธีการโทร () มีค่าส่งคืน
(2) สร้างอินสแตนซ์ของคลาสการใช้งานที่เรียกได้และใช้คลาส FutureTask เพื่อห่อวัตถุที่เรียกได้ วัตถุ FutureTask ห่อหุ้มค่าการส่งคืนของวิธีการโทร ()
(3) สร้างและเริ่มเธรดใหม่โดยใช้วัตถุ FutureTask เป็นเป้าหมายของวัตถุเธรด
(4) เรียกใช้เมธอด Get () ของวัตถุ FutureTask เพื่อรับค่าส่งคืนหลังจากดำเนินการเธรดลูก
รหัสที่เกี่ยวข้องมีดังนี้:
/ *** ใช้ callable เพื่อใช้คลาสเธรด*/ คลาสสาธารณะที่สาม enprence callable <integer> {ตั๋ว INT ส่วนตัว = 20; @Override การเรียกใช้จำนวนเต็มสาธารณะ () {สำหรับ (int i = 0; i <10; i ++) {// รับเธรดปัจจุบันคุณสามารถใช้เธรด currentThread () เพื่อรับชื่อเธรดปัจจุบัน // log.d (แท็ก, เธรด if (this.ticket> 0) {log.e (tag, thread.currentthread (). getName () + ", ตั๋ว: ticket =" + ตั๋ว-); }} ตั๋วส่งคืน; }} โมฆะส่วนตัว StarCallableThread () {ThirdThread ThirdThread = new ThirdThread (); FutureTask <Integer> task = New FutureTask <Integer> (ThirdThread); เธรดใหม่ (งาน, "เธรดที่มีค่าส่งคืน"). start (); ลอง {จำนวนเต็มจำนวนเต็ม = task.get (); log.d (แท็ก, "starcallableThread, ค่าส่งคืนของเธรดลูก ="+จำนวนเต็ม); } catch (interruptedException e) {e.printStackTrace (); } catch (ExecutionException E) {E.printStackTrace (); -ผลการทำงาน:
หมายเหตุ: วิธีการโทรของ Callable () อนุญาตให้มีการประกาศเพื่อโยนข้อยกเว้นและอนุญาตให้มีค่าส่งคืน
ในที่สุดโปรแกรมจะเรียกวิธีการรับ () ของวัตถุ FutureTask เพื่อส่งคืนค่าการส่งคืนของวิธีการโทร () ทำให้เธรดหลักถูกบล็อกจนกว่าเมธอดการโทร () จะสิ้นสุดและส่งคืน
4. การเปรียบเทียบสามวิธี
สร้างมัลติเธรดโดยสืบทอดคลาสเธรด
ข้อเสีย: คลาสเธรดได้รับการสืบทอดไม่สามารถสืบทอดได้จากคลาสแม่อื่น ๆ
ข้อดี: เขียนง่ายๆ
สร้างมัลติเธรดโดยใช้วิธีการสืบทอดอินเทอร์เฟซที่เรียกใช้และเรียกได้
ข้อเสีย: การเขียนโปรแกรมมีความซับซ้อนเล็กน้อย หากคุณต้องการเข้าถึงเธรดปัจจุบันคุณต้องใช้ thread.currentthread ()
ข้อดี:
(1) นอกจากนี้ยังสามารถสืบทอดคลาสอื่น ๆ (2) หลายเธรดสามารถแชร์วัตถุเป้าหมายได้ดังนั้นจึงเหมาะมากสำหรับเธรดที่เหมือนกันหลายตัวเพื่อจัดการทรัพยากรเดียวกันดังนั้นจึงแยก CPU, รหัสและข้อมูลเพื่อสร้างแบบจำลองที่ชัดเจนซึ่งสะท้อนแนวคิดเชิงวัตถุของคลาส
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!