ความแตกต่างระหว่างวิธีการเริ่มต้นและวิธีการเรียกใช้ในเธรด
ในเธรดหากวิธีการเริ่มเรียกใช้วิธีการเรียกใช้ในทางกลับกันทำไมเราถึงเลือกเรียกวิธีการเริ่มต้น หรือความแตกต่างระหว่างการเรียกวิธีการเริ่มต้นและวิธีการเรียกใช้ในเธรด Java คืออะไร? คำถามสองข้อนี้เป็นคำถามสัมภาษณ์แบบมัลติเธรดที่ได้รับความนิยมมากสองคำถามในระดับเริ่มต้น เมื่อโปรแกรมเมอร์ Java เริ่มเรียนรู้เธรดพวกเขาจะเรียนรู้ที่จะสืบทอดคลาสเธรดให้โอเวอร์โหลดเมธอดรันหรือใช้อินเตอร์เฟส Runnable ใช้วิธีการเรียกใช้จากนั้นเรียกใช้วิธีการเริ่มต้นของอินสแตนซ์เธรด แต่หลังจากที่เขามีประสบการณ์บางอย่างเขาจะพบว่าวิธีการเริ่มต้นจะเรียกวิธีการวิ่งภายในโดยดูที่เอกสาร API หรือวิธีอื่น ๆ แต่พวกเราหลายคนรู้ว่าเมื่อเราถูกถามในระหว่างการสัมภาษณ์เราจะตระหนักถึงความสำคัญของคำถามนี้ ในบทช่วยสอน Java นี้เราจะเข้าใจความแตกต่างระหว่างการเรียกใช้วิธีการเริ่มต้นและวิธีการเรียกใช้เมื่อเริ่มเธรดใน Java
โพสต์นี้เป็นบทความเกี่ยวกับบทความของเราที่ตีพิมพ์ใน Java MultithReading เช่นความแตกต่างระหว่าง Runnable และ Thread ใน Java และวิธีการแก้ปัญหาผู้ผลิตของผู้ผลิตใน Java โดยใช้ BlockingQueue หากคุณยังไม่ได้อ่านคุณอาจพบว่าน่าสนใจและมีประโยชน์
ความแตกต่างระหว่างการเริ่มต้นและเรียกใช้ในกระทู้ Java
ความแตกต่างที่สำคัญระหว่างวิธีการเริ่มต้นและการเรียกใช้คือเมื่อโปรแกรมเรียกวิธีการเริ่มต้นเธรดใหม่จะถูกสร้างขึ้นและรหัสในวิธีการเรียกใช้จะทำงานบนเธรดใหม่ อย่างไรก็ตามเมื่อคุณเรียกใช้วิธีการเรียกใช้โดยตรงโปรแกรมจะไม่สร้างเธรดใหม่และรหัสภายในวิธีการเรียกใช้จะทำงานบนเธรดปัจจุบัน ในกรณีส่วนใหญ่การเรียกวิธีการเรียกใช้เป็นข้อผิดพลาดหรือความผิดพลาด เนื่องจากความตั้งใจดั้งเดิมของผู้โทรคือการเรียกใช้วิธีการเริ่มต้นเพื่อเริ่มเธรดใหม่ข้อผิดพลาดนี้สามารถตรวจพบได้ด้วยเครื่องมือครอบคลุมรหัสสถิตหลายอย่างเช่น FingBugs หากคุณต้องการเรียกใช้งานที่ต้องใช้เวลามากควรใช้วิธีการเริ่มต้นมิฉะนั้นเธรดหลักของคุณจะติดอยู่เมื่อคุณเรียกวิธีการเรียกใช้ ความแตกต่างอีกประการหนึ่งคือเมื่อเริ่มเธรดคุณไม่สามารถเรียกใช้วิธีการเริ่มต้นของวัตถุเธรดได้ซ้ำ ๆ การเรียกใช้วิธีการเริ่มต้นของเธรดที่เริ่มต้นแล้วจะรายงานข้อยกเว้นที่ผิดกฎหมาย stateException แต่คุณสามารถเรียกใช้วิธีการเรียกใช้ซ้ำ ๆ
ต่อไปนี้เป็นตัวอย่างของวิธีการเริ่มต้นและวิธีการเรียกใช้
งานในเธรดคือการพิมพ์ชื่อของเธรดปัจจุบันที่ส่งผ่านในค่าสตริง
ที่นี่เราสามารถเห็นความแตกต่างระหว่างสองอย่างชัดเจน
คลาสสาธารณะ diffbewteenstartandrun {โมฆะคงที่สาธารณะหลัก (สตริง args []) {system.out.println (thread.currentthread (). getName ()); // การสร้างสองเธรดสำหรับการเริ่มต้นและเรียกใช้เมธอดการเรียกเธรดการเรียก startThread = เธรดใหม่ (งานใหม่ ("เริ่มต้น")); เธรด runThread = เธรดใหม่ (งานใหม่ ("เรียกใช้")); startthread.start (); // การเรียกใช้เมธอดเริ่มต้นของเธรด - จะดำเนินการใน // เธรดใหม่ runthread.run (); // การเรียกใช้วิธีการเรียกใช้ของเธรด - จะดำเนินการใน // เธรดปัจจุบัน}/ * * การใช้งานที่ใช้งานง่ายอย่างง่าย */ งานคลาสคงที่ส่วนตัวใช้งานใช้งาน runnable {ผู้โทรสตริงส่วนตัว; งานสาธารณะ (String Caller) {this.caller = caller; } @Override โมฆะสาธารณะ Run () {System.out.println ("Caller:" + Caller + "และรหัสในเธรดนี้ดำเนินการโดย:" + thread.currentthread (). getName ()); -ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!