มัลติเธรดใน Java อธิบาย [พร้อมตัวอย่าง]
เผยแพร่แล้ว: 2021-06-15สารบัญ
กระทู้ในภาษา Java
เธรดใน Java ช่วยการทำงานของโปรแกรมอย่างมีประสิทธิภาพ หน่วยพื้นฐานของการดำเนินการ proforma สองหน่วยคือกระบวนการและเธรด กระบวนการอาจเป็นแอปพลิเคชัน โปรแกรม หรือสภาพแวดล้อมการดำเนินการในตัวเอง
ในขณะที่เธรดแบ่งปันทรัพยากรให้กับกระบวนการและมีอยู่ด้วย มีอย่างน้อยหนึ่งเธรดในทุกแอปพลิเคชัน java ที่เรียกว่าเธรดหลัก สามารถสร้างเธรดได้หลายเธรดจากเธรดหลัก เรียนรู้เพิ่มเติมเกี่ยวกับวิธีสร้างเธรดใน Java
ประโยชน์ของ Java Thread
- ใช้เวลาและทรัพยากรน้อยลงในการสร้างเธรดเมื่อเทียบกับกระบวนการ ดังนั้นเธรดจึงเรียกว่ากระบวนการที่มีน้ำหนักเบา
- ข้อมูลกระบวนการหลักและรหัสถูกใช้ร่วมกันโดยเธรด
- การสื่อสารระหว่างเธรดเป็นเรื่องง่ายเมื่อเทียบกับการสื่อสารระหว่างกันในกระบวนการ
- สามารถสร้างเธรดใน Java ได้โดยใช้ java.lang อินเทอร์เฟซที่รันได้
เธรดเดียว
หน่วยประมวลผลหลายตัวมีอยู่ในโปรแกรมซึ่งหน่วยที่เล็กที่สุดเรียกว่าเธรดเดียว ผ่านการใช้ "คลาสเธรด" Java ใช้เธรด มีเกลียวอยู่สองประเภท เธรด daemon และเธรดผู้ใช้
เมื่อมีการล้างแอปพลิเคชัน การใช้เธรด daemon จะเกิดขึ้น มันทำงานในพื้นหลังของแอปพลิเคชัน ในขณะที่เธรดผู้ใช้จะถูกสร้างขึ้นเมื่อแอปพลิเคชันเริ่มทำงานครั้งแรก
ข้อดีของเธรดเดียว:
- โอเวอร์เฮดของแอปพลิเคชันจะลดลงเมื่อมีการเรียกใช้เธรดเดี่ยวในระบบ
- ค่าบำรุงรักษาของแอปพลิเคชันลดลงด้วยการใช้เธรดเดี่ยว
มัลติทาสกิ้งใน Java
การทำงานหลายอย่างพร้อมกันหมายถึงกระบวนการทำงานหลายอย่างโดย CPU ในคราวเดียว บางครั้งการสลับ CPU อาจดำเนินการระหว่างงานโดยผู้ใช้เพื่อทำงานร่วมกับแต่ละโปรแกรมร่วมกัน หน่วยความจำและทรัพยากรที่แยกจากกันจะถูกจัดสรรให้กับกระบวนการในการทำงานหลายอย่างพร้อมกัน สามารถทำได้สองวิธี
1. มัลติโพรเซสซิ่ง (มัลติทาสกิ้งแบบอิงตามกระบวนการ)
- มีการจัดสรรพื้นที่หน่วยความจำแยกต่างหากสำหรับแต่ละกระบวนการ จึงมีที่อยู่สำหรับแต่ละกระบวนการในหน่วยความจำ
- กระบวนการนี้มีน้ำหนักมาก
- มีค่าใช้จ่ายในการสื่อสารระหว่างกระบวนการสูง
- ต้องใช้เวลาในการเปลี่ยนระหว่างกระบวนการ สิ่งนี้จำเป็นสำหรับการอัปเดตรายการ แผนที่หน่วยความจำ ฯลฯ
2. มัลติเธรด (มัลติทาสกิ้งแบบอิงตามเธรด)
- ที่อยู่เดียวกันนั้นใช้ร่วมกันระหว่างเธรด
- เส้นด้ายมีน้ำหนักเบา
- มีค่าใช้จ่ายในการสื่อสารระหว่างเธรดต่ำ
มัลติเธรดคืออะไร
เมื่อเธรดตั้งแต่สองเธรดขึ้นไปทำงานพร้อมกันในโปรแกรม กลไกจะเรียกว่ามัลติเธรด กระบวนการเดียวสร้างเธรดจำนวนมากเพื่อเพิ่มพลังในการคำนวณ การทำงานของโปรแกรมตั้งแต่สองส่วนขึ้นไปในลักษณะที่นำไปสู่การใช้ประโยชน์สูงสุดของ CPU
เธรดถูกอ้างถึงเป็นส่วนต่าง ๆ ของโปรแกรม กระบวนการในแอปพลิเคชันสามารถมีได้หลายเธรดหรือเธรดเดียว
Java Virtual Machine อนุญาตให้ใช้หลายเธรดของแอปพลิเคชัน ทุกเธรดมีลำดับความสำคัญของตัวเอง ดังนั้น การกำหนดค่าตามความชอบของการดำเนินการจะถูกกำหนดให้กับเธรดที่มีลำดับความสำคัญสูงกว่าที่มีลำดับความสำคัญต่ำกว่า
เพื่อให้เกิดการทำงานหลายอย่างพร้อมกัน จะใช้ทั้งกระบวนการของมัลติเธรดและมัลติโพรเซสซิง เนื่องจากมีการใช้พื้นที่หน่วยความจำแบบแบ่งใช้ในการทำมัลติเธรด ส่วนใหญ่จะใช้กับการประมวลผลหลายตัว หน่วยความจำจะถูกบันทึกเนื่องจากไม่จำเป็นต้องจัดสรรหน่วยความจำเพิ่มเติม นอกจากนี้ เวลาที่ใช้จะน้อยกว่าการประมวลผลหลายตัวเนื่องจากการสลับบริบทเกิดขึ้นระหว่างเธรด
ในแอนิเมชั่น เกม ใช้ Java multithreading คลิกหากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสถาปัตยกรรมและส่วนประกอบ Java
สามารถใช้กลไกสองแบบเพื่อสร้างเธรดได้
1. ส่วนขยายคลาสเธรด
2. การใช้งานอินเทอร์เฟซที่รันได้
คลาสเธรดเทียบกับอินเทอร์เฟซที่รันได้
- การขยาย "คลาสเธรด" ไม่สามารถขยายคลาสอื่นได้เนื่องจาก Java ไม่รองรับการสืบทอดหลายรายการ แต่ด้วยการใช้งานอินเทอร์เฟซ "Runnable" คลาสพื้นฐานอื่น ๆ สามารถขยายจากคลาสได้
- ฟังก์ชันพื้นฐานของเธรดสามารถขยายได้ผ่านการขยายคลาสของเธรดเนื่องจากมีการจัดเตรียมเมธอดในตัว เช่นอินเตอร์รัปต์ (), ผลตอบแทน () เป็นต้น
- ออบเจ็กต์ที่สามารถใช้ร่วมกันได้หลายเธรดจะมีให้เมื่อใช้ runnable
คลาสเธรด Java
การเขียนโปรแกรมเธรดใน Java ทำได้ผ่านคลาสเธรด คอนสตรัคเตอร์ถูกจัดเตรียมโดยคลาสของเธรดและเมธอดสำหรับการดำเนินการกับเธรด คลาสเธรดใช้อินเทอร์เฟซที่รันได้และขยายคลาสอ็อบเจ็กต์
วิธีการเธรดทั่วไปที่ใช้คือ:
- start(): การดำเนินการเธรดเริ่มต้นด้วยวิธีนี้ เรียกใช้เมธอด run() โดย JVM
- sleep(int มิลลิวินาที): การดำเนินการของเธรดหยุดชั่วคราวเป็นมิลลิวินาทีที่จัดเตรียมไว้เนื่องจากกระบวนการเธรดถูกทำให้เข้าสู่โหมดสลีปโดยใช้วิธีนี้ หลังจากหยุดชั่วคราว การดำเนินการของเธรดจะเริ่มต้นอีกครั้ง เธรดสามารถซิงโครไนซ์ได้ด้วยวิธีนี้
- getName(): ชื่อเธรดถูกส่งกลับด้วยวิธีนี้
- setPriority(int ลำดับความสำคัญใหม่): ลำดับความสำคัญของเธรดมีการเปลี่ยนแปลงด้วยวิธีนี้
- อัตราผลตอบแทน (): เธรดปัจจุบันถูกสร้างขึ้นเพื่อหยุดการทำงานของเธรดอื่นด้วยวิธีนี้
- run(): วิธีการนี้ใช้สำหรับเริ่มการดำเนินการในเธรด
- getPriority(): ลำดับความสำคัญของเธรดถูกส่งกลับโดยใช้เมธอดนี้
- setName(): เปลี่ยนชื่อเธรดด้วยวิธีนี้
- getId(): รหัสเธรดถูกส่งกลับด้วยวิธีนี้
- suspend(): เธรดถูกระงับด้วยวิธีนี้
วงจรชีวิตเกลียว
วงจรชีวิตของเธรดมีขั้นตอนต่างๆ ซึ่งแสดงไว้ด้านล่าง:
- ใหม่: “คลาสเธรด” ใช้สำหรับสร้างเธรดในขั้นตอนนี้ จนกว่าเธรดจะเริ่มต้น โปรแกรมยังคงอยู่ในขั้นตอนนี้ วิธีการนี้เรียกว่าเธรดที่เกิด
- Runnable: วิธีการเริ่มต้นเรียกใช้อินสแตนซ์ของเธรดในขั้นตอนนี้ของวงจรชีวิตของเธรด ตัวกำหนดตารางเวลาจะถูกส่งไปพร้อมกับการควบคุมของเธรดเพื่อสิ้นสุดการดำเนินการ เธรดควรได้รับการดำเนินการหรือไม่ขึ้นอยู่กับตัวกำหนดตารางเวลา
- กำลังทำงาน: เมื่อเริ่มการดำเนินการของเธรด สเตจจะถูกเลื่อนไปที่สเตจ "กำลังทำงาน" หนึ่งเธรดถูกเลือกโดยตัวจัดกำหนดการจากพูลของเธรด และเริ่มการดำเนินการของแอปพลิเคชัน
- รอคอย : ตามที่ชื่อแนะนำ ในระยะนี้ของวงจรชีวิต เธรดจะรอ การซิงโครไนซ์เธรดเป็นสิ่งจำเป็นเนื่องจากการรันหลายเธรดในแอปพลิเคชัน ดังนั้นจึงมีความจำเป็นสำหรับเธรดที่จะรอจนกว่าการดำเนินการของเธรดอื่นจะเสร็จสิ้น ดังนั้นระยะของวงจรชีวิตจึงเรียกว่าระยะรอ
- ตาย: สเตจที่สิ้นสุดเธรดเกิดขึ้นเรียกว่าสเตจ "ตาย" เมื่อเธรดได้รับการถ่ายโอนจากการรันไปยังจุดสิ้นสุดของการประมวลผล เธรดจะถูกยกเลิกและด้วยเหตุนี้จึงอยู่ใน "สถานะตาย"
การซิงโครไนซ์เธรดใน Java
พฤติกรรมแบบอะซิงโครนัสเกิดขึ้นในโปรแกรมในกรณีของมัลติเธรด หากข้อมูลที่คาดคะเนเขียนผ่านเธรดหนึ่งและการอ่านข้อมูลถูกดำเนินการโดยเธรดอื่นพร้อมกัน อาจสร้างความไม่สอดคล้องกันในแอปพลิเคชัน
ทรัพยากรที่แชร์ระหว่างเธรดจำเป็นต้องเข้าถึงโดยเธรดอื่น ดังนั้นในกรณีเช่นนี้ วิธีการซิงโครไนซ์จึงเข้ามาใกล้ วิธีการซิงโครไนซ์มีอยู่ใน Java เพื่อให้เกิดพฤติกรรมการซิงโครไนซ์
เมื่อเธรดไปถึงบล็อกที่ซิงโครไนซ์ เมื่อถึงบล็อก เมธอดจะไม่สามารถเรียกเมธอดอื่นในอ็อบเจ็กต์เดียวกันได้ จนกว่าเธรดจะเสร็จสิ้นการดำเนินการบล็อกและออกจากเธรดนั้น เธรดอื่นๆ จะต้องหยุดและรอ
เรียนรู้ หลักสูตรซอฟต์แวร์ ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
ข้อดีของมัลติเธรด
- สามารถดำเนินการได้หลายอย่างพร้อมกัน เมื่อเธรดอิสระทำงาน ผู้ใช้จะไม่ถูกบล็อก
- เวลาจะถูกบันทึกเป็นการดำเนินการหลายอย่างพร้อมกัน
- เธรดอื่นไม่สามารถได้รับผลกระทบจากเธรดอื่นเนื่องจากไม่สัมพันธ์กัน การเกิดข้อยกเว้นในเธรดหนึ่งจะไม่ส่งผลต่อการทำงานของเธรดอื่น
ตัวอย่างการทำมัลติเธรด
ตัวอย่างของโปรแกรม multithreading ใน java แสดงไว้ด้านล่าง:
แหล่งที่มา
รูปที่ 1: ตัวอย่างโค้ดมัลติเธรด
คำอธิบายรหัส
บรรทัดที่ 3: คลาส "GuruThread1" ใช้งาน runnable
บรรทัดที่ 8: แสดงวิธีการหลักของคลาส
บรรทัดที่ 9: คลาสเธรดถูกสร้างอินสแตนซ์และอินสแตนซ์ "guruThread1" ถูกสร้างขึ้นและสร้างเธรด
บรรทัดที่ 10: "คลาสเธรด" ถูกสร้างอินสแตนซ์และอินสแตนซ์ "guruThread2" และสร้างเธรด
บรรทัดที่ 11: เธรดชื่อ guruThread1 เริ่มต้นขึ้น
บรรทัดที่ 12: เธรดชื่อ guruThread2 เริ่มต้นขึ้น
บรรทัดที่ 13: ข้อความ "ชื่อเธรดกำลังติดตาม:" ถูกส่งออก
บรรทัดที่ 14: เมธอด getName() ใช้เพื่อรับชื่อ thread1
บรรทัดที่ 15: เมธอด getName() ใช้เพื่อรับชื่อ thread2
การดำเนินการของรหัสข้างต้นส่งผลให้เกิดผลลัพธ์ต่อไปนี้:
แหล่งที่มา
รูปภาพ: ภาพหน้าจอของเอาต์พุตที่สร้างจาก โปรแกรมมัลติเธรดใน Java (นำมาจาก
บทสรุป
บทความนี้กล่าวถึงแนวคิดของการทำ มัลติเธรดใน Java พร้อมกับตัวอย่างของ โปรแกรมมัลติเธรดในจาวา การเรียนรู้ของคุณไม่ได้หยุดอยู่แค่นี้และเข้ากันได้ดีกับแนวคิดพื้นฐานอื่นๆ ของ Java
หากคุณสนใจที่จะฝึกฝนทักษะการเขียนโปรแกรมในราคาที่เป็นมิตรและเตรียมพร้อมสำหรับอุตสาหกรรม คุณสามารถตรวจสอบหลักสูตรที่เปิดสอนโดย upGrad "วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์" สำหรับมืออาชีพระดับกลางทุกคนภายในกลุ่มอายุ 21 ถึง 45 ปี หลักสูตรนี้ได้รับการรับรองโดย Liverpool John Moores University และได้รับการออกแบบด้วยการเรียนรู้มากกว่า 500 ชั่วโมง, 309 โครงการและการบ้านเพื่อดึงสิ่งที่ดีที่สุดสำหรับคุณ หากคุณมีคำถามใด ๆ ส่งข้อความถึงเรา ทีมงานของเราจะติดต่อกลับหาคุณ