คลาสเธรดมีวิธีการเริ่มต้น () และเรียกใช้ () บทนี้จะตอบคำถามนี้ เนื้อหาของบทนี้รวมถึง:
คำอธิบายของความแตกต่างระหว่าง start () และ run ()
ตัวอย่างความแตกต่างระหว่าง start () และ run ()
ซอร์สโค้ดที่เกี่ยวข้องกับ Start () และ Run () (ขึ้นอยู่กับ JDK1.7.0_40)
คำอธิบายของความแตกต่างระหว่าง start () และ run ()
เริ่มต้น (): ฟังก์ชั่นของมันคือการเริ่มเธรดใหม่และเธรดใหม่จะเรียกใช้วิธีการเรียกใช้ () ที่สอดคล้องกัน เริ่มต้น () ไม่สามารถเรียกได้ซ้ำ ๆ
Run (): Run () สามารถเรียกได้ซ้ำ ๆ เช่นเดียวกับวิธีการสมาชิกทั่วไป หากคุณเรียกเรียกใช้ () แยกต่างหากให้เรียกใช้ () จะถูกดำเนินการในเธรดปัจจุบันและเธรดใหม่จะไม่เริ่มต้น!
ต่อไปนี้เป็นรหัสที่จะอธิบาย
การคัดลอกรหัสมีดังนี้:
คลาส MyThread ขยายเธรด {
โมฆะสาธารณะเรียกใช้ () {
-
-
-
MYTHREAD MYTHREAD = NEW MYTHREAD ();
mythread.start () เริ่มเธรดใหม่และเรียกใช้วิธีการเรียกใช้ () ในเธรดใหม่
mythread.run () จะเรียกใช้วิธีการเรียกใช้ () โดยตรงในเธรดปัจจุบันและจะไม่เริ่มเธรดใหม่เพื่อเรียกใช้ Run ()
ตัวอย่างความแตกต่างระหว่าง start () และ run ()
ด้านล่างแสดงให้เห็นถึงความแตกต่างระหว่างพวกเขาด้วยตัวอย่างง่ายๆ ซอร์สโค้ดมีดังนี้:
การคัดลอกรหัสมีดังนี้:
การเริ่มต้นโมฆะแบบซิงโครไนซ์สาธารณะ () {
// ถ้าเธรดไม่ "พร้อม" ข้อยกเว้นจะถูกโยนลงไป!
ถ้า (ThreadStatus! = 0)
โยนใหม่ unlegalThreadStateException ();
// เพิ่มเธรดลงใน ThreadingGroup
group.add (นี่);
บูลีนเริ่มต้น = false;
พยายาม {
// เริ่มเธรดผ่าน start0 ()
start0 ();
// ตั้งค่าแท็กเริ่มต้น
เริ่มต้น = จริง;
} ในที่สุด {
พยายาม {
ถ้า (! เริ่ม) {
group.threadstartfailed (นี่);
-
} catch (ไม่สนใจแบบโยนได้) {
-
-
-
ผลการทำงาน:
การคัดลอกรหัสมีดังนี้:
Main Call MyThread.run ()
หลักกำลังทำงานอยู่
Main Call MyThread.start ()
MyThread กำลังทำงานอยู่
ผลลัพธ์คำอธิบาย:
(01) thread.currentthread (). getName () เป็นชื่อที่ใช้เพื่อรับ "เธรดปัจจุบัน" เธรดปัจจุบันหมายถึงเธรดที่กำหนดให้ดำเนินการใน CPU
(02) Mythread.run () เรียกว่าใน "Main Thread Main" และวิธีการเรียกใช้ () ทำงานโดยตรงบน "Main Thread Main"
(03) MyThread.start () จะเริ่ม "เธรด MyThread"
ซอร์สโค้ดที่เกี่ยวข้องกับ Start () และ Run () (ขึ้นอยู่กับ JDK1.7.0_40)
ซอร์สโค้ดของเมธอด start () ใน thread.java มีดังนี้:
การคัดลอกรหัสมีดังนี้:
การเริ่มต้นโมฆะแบบซิงโครไนซ์สาธารณะ () {
// ถ้าเธรดไม่ "พร้อม" ข้อยกเว้นจะถูกโยนลงไป!
ถ้า (ThreadStatus! = 0)
โยนใหม่ unlegalThreadStateException ();
// เพิ่มเธรดลงใน ThreadingGroup
group.add (นี่);
บูลีนเริ่มต้น = false;
พยายาม {
// เริ่มเธรดผ่าน start0 ()
start0 ();
// ตั้งค่าแท็กเริ่มต้น
เริ่มต้น = จริง;
} ในที่สุด {
พยายาม {
ถ้า (! เริ่ม) {
group.threadstartfailed (นี่);
-
} catch (ไม่สนใจแบบโยนได้) {
-
-
-
หมายเหตุ: start () จริงเริ่มต้นเธรดผ่านวิธีการท้องถิ่น start0 () start0 () จะเรียกใช้เธรดใหม่และเธรดใหม่จะเรียกวิธีการเรียกใช้ ()
การคัดลอกรหัสมีดังนี้:
เป็นโมฆะดั้งเดิมเริ่มต้น 0 ();
รหัสของการเรียกใช้ () ใน thread.java มีดังนี้:
การคัดลอกรหัสมีดังนี้:
โมฆะสาธารณะเรียกใช้ () {
if (target! = null) {
target.run ();
-
-
คำอธิบาย: เป้าหมายเป็นวัตถุที่รันได้ Run () คือการเรียกใช้วิธีการเรียกใช้ () ของสมาชิกที่รันได้ของเธรดเธรดโดยตรงและจะไม่สร้างเธรดใหม่