มัลติเธรดใน 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 ทำได้ผ่านคลาสเธรด คอนสตรัคเตอร์ถูกจัดเตรียมโดยคลาสของเธรดและเมธอดสำหรับการดำเนินการกับเธรด คลาสเธรดใช้อินเทอร์เฟซที่รันได้และขยายคลาสอ็อบเจ็กต์

วิธีการเธรดทั่วไปที่ใช้คือ:

  1. start(): การดำเนินการเธรดเริ่มต้นด้วยวิธีนี้ เรียกใช้เมธอด run() โดย JVM
  2. sleep(int มิลลิวินาที): การดำเนินการของเธรดหยุดชั่วคราวเป็นมิลลิวินาทีที่จัดเตรียมไว้เนื่องจากกระบวนการเธรดถูกทำให้เข้าสู่โหมดสลีปโดยใช้วิธีนี้ หลังจากหยุดชั่วคราว การดำเนินการของเธรดจะเริ่มต้นอีกครั้ง เธรดสามารถซิงโครไนซ์ได้ด้วยวิธีนี้
  3. getName(): ชื่อเธรดถูกส่งกลับด้วยวิธีนี้
  4. setPriority(int ลำดับความสำคัญใหม่): ลำดับความสำคัญของเธรดมีการเปลี่ยนแปลงด้วยวิธีนี้
  5. อัตราผลตอบแทน (): เธรดปัจจุบันถูกสร้างขึ้นเพื่อหยุดการทำงานของเธรดอื่นด้วยวิธีนี้
  6. run(): วิธีการนี้ใช้สำหรับเริ่มการดำเนินการในเธรด
  7. getPriority(): ลำดับความสำคัญของเธรดถูกส่งกลับโดยใช้เมธอดนี้
  8. setName(): เปลี่ยนชื่อเธรดด้วยวิธีนี้
  9. getId(): รหัสเธรดถูกส่งกลับด้วยวิธีนี้
  10. suspend(): เธรดถูกระงับด้วยวิธีนี้

วงจรชีวิตเกลียว

วงจรชีวิตของเธรดมีขั้นตอนต่างๆ ซึ่งแสดงไว้ด้านล่าง:

  1. ใหม่: “คลาสเธรด” ใช้สำหรับสร้างเธรดในขั้นตอนนี้ จนกว่าเธรดจะเริ่มต้น โปรแกรมยังคงอยู่ในขั้นตอนนี้ วิธีการนี้เรียกว่าเธรดที่เกิด
  2. Runnable: วิธีการเริ่มต้นเรียกใช้อินสแตนซ์ของเธรดในขั้นตอนนี้ของวงจรชีวิตของเธรด ตัวกำหนดตารางเวลาจะถูกส่งไปพร้อมกับการควบคุมของเธรดเพื่อสิ้นสุดการดำเนินการ เธรดควรได้รับการดำเนินการหรือไม่ขึ้นอยู่กับตัวกำหนดตารางเวลา
  3. กำลังทำงาน: เมื่อเริ่มการดำเนินการของเธรด สเตจจะถูกเลื่อนไปที่สเตจ "กำลังทำงาน" หนึ่งเธรดถูกเลือกโดยตัวจัดกำหนดการจากพูลของเธรด และเริ่มการดำเนินการของแอปพลิเคชัน
  4. รอคอย : ตามที่ชื่อแนะนำ ในระยะนี้ของวงจรชีวิต เธรดจะรอ การซิงโครไนซ์เธรดเป็นสิ่งจำเป็นเนื่องจากการรันหลายเธรดในแอปพลิเคชัน ดังนั้นจึงมีความจำเป็นสำหรับเธรดที่จะรอจนกว่าการดำเนินการของเธรดอื่นจะเสร็จสิ้น ดังนั้นระยะของวงจรชีวิตจึงเรียกว่าระยะรอ
  5. ตาย: สเตจที่สิ้นสุดเธรดเกิดขึ้นเรียกว่าสเตจ "ตาย" เมื่อเธรดได้รับการถ่ายโอนจากการรันไปยังจุดสิ้นสุดของการประมวลผล เธรดจะถูกยกเลิกและด้วยเหตุนี้จึงอยู่ใน "สถานะตาย"

การซิงโครไนซ์เธรดใน 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 โครงการและการบ้านเพื่อดึงสิ่งที่ดีที่สุดสำหรับคุณ หากคุณมีคำถามใด ๆ ส่งข้อความถึงเรา ทีมงานของเราจะติดต่อกลับหาคุณ

ลงจอดบนงานในฝันของคุณ

สมัคร Executive PG Program ด้าน Software Development จาก IIIT-B