จะสร้างเธรดใน Java ได้อย่างไร? | มัลติเธรดใน Java

เผยแพร่แล้ว: 2020-12-29

ในบทความนี้ เราจะมาดูที่เธรดใน Java และสำรวจกลไกที่ทำให้เธรดเป็นไปได้

สารบัญ

เธรดใน Java

คุณลักษณะเธรดใน Java เป็นกระบวนการย่อยที่มีน้ำหนักเบา ถือว่าเป็นหน่วยการประมวลผลที่เล็กที่สุด เป็นวิธีการทำงานหลายอย่างพร้อมกันในโปรแกรม เป็นคุณสมบัติที่มีประโยชน์เมื่อพูดถึงเกม แอนิเมชั่น ฯลฯ

Java มีการสนับสนุนในตัวสำหรับการสร้างเธรดและมัลติเธรด นี่เป็นวิธีการที่ชาญฉลาดในการลดความไร้ประสิทธิภาพและการดึงข้อมูลโดยใช้พื้นที่ CPU ให้เกิดประโยชน์สูงสุด ใน Java สามารถทำได้สองวิธี:

  1. ขยายคลาสเธรดหรือ
  2. ใช้ Runnable Interface

เมื่อมีการดำเนินการมากกว่าหนึ่งเธรดพร้อมกัน เรียกว่ามัลติเธรด โดยพื้นฐานแล้วจะช่วยให้ส่วนต่างๆ ของโปรแกรมทำงานพร้อมกันได้ โดยแต่ละส่วนของเธรดและแต่ละเธรดจะดำเนินไปตามเส้นทางที่แตกต่างกันเพื่อดำเนินการ

เธรดใช้พื้นที่หน่วยความจำที่ใช้ร่วมกัน ไม่ได้จัดสรรหน่วยความจำให้แต่ละส่วน ส่งผลให้มีการใช้งาน CPU สูงสุด นอกจากนี้ การเปลี่ยนบริบทใช้เวลาไม่นาน อย่างไรก็ตาม เธรดจำนวนมากเกินไปอาจทำให้ CPU ของคุณมีส่วนร่วมกับการสลับบริบทและการดำเนินการของคุณอาจล่าช้า

เธรดสามารถมีอยู่ในหนึ่งในหกสถานะต่อไปนี้

  1. ใหม่ – ทันทีที่สร้างเธรด เธรดนั้นจะอยู่ในสถานะใหม่ โดยพื้นฐานแล้วหมายความว่าเธรดยังไม่เริ่มดำเนินการ
  2. กำลังทำงาน – เมื่อเธรดกำลังดำเนินการหรืออยู่ในบรรทัดที่จะดำเนินการ เธรดจะอยู่ในสถานะกำลังทำงาน
  3. กำลังรอ – เธรดที่กำลังรันอยู่บางครั้งถูกหยุดหรือระงับชั่วคราวเพื่อให้เกิดกิจกรรมอื่นขึ้น เวอร์ชันที่ไม่หมดเวลาของ wait() หรือ join() สามารถระงับเธรดไม่ให้ดำเนินการได้ เมื่อดำเนินการแล้ว เธรดที่ถูกระงับจะกลับมาทำงานต่อ
  4. TIMED-WAITING – เธรดที่กำลังรันอยู่บางครั้งอาจหยุดหรือระงับชั่วคราวในระยะเวลาที่กำหนด ตัวอย่างเช่น เมื่อเรียกใช้ฟังก์ชัน sleep()
  5. ถูกบล็อก – เมื่อเธรด Java ที่ถูกระงับไม่สามารถรับทรัพยากรใด ๆ ได้ เธรดนั้นจะถูกบล็อกและอยู่ในสถานะที่ถูกบล็อก
  6. TERMINATED – เมื่อเธรดเสร็จสิ้นการดำเนินการ เธรดจะอยู่ในสถานะสิ้นสุด อย่างไรก็ตาม คุณสามารถยุติเธรดเมื่อใดก็ได้

เรียนรู้เพิ่มเติมเกี่ยวกับสถาปัตยกรรมและส่วนประกอบ Java

ประโยชน์ของการสร้างเธรดใน Java

มีข้อดีหลายประการในการสร้างเธรด บางส่วนเหล่านี้คือ

  1. เนื่องจากเธรดมีความเป็นอิสระ การดำเนินการหนึ่งจึงไม่มีผลกับเธรดอื่น แม้ว่าจะทำงานบนพื้นที่หน่วยความจำที่ใช้ร่วมกัน นอกจากนี้ยังหมายความว่าคุณสามารถดำเนินการได้มากกว่าหนึ่งรายการพร้อมกัน
  2. การทำเกลียวเป็นรูปแบบหนึ่งของการทำงานหลายอย่างพร้อมกันและช่วยประหยัดเวลา
  3. ข้อผิดพลาดในชุดข้อความหนึ่งไม่มีผลกับอีกชุดข้อความหนึ่ง

จะสร้างเธรดใน Java ได้อย่างไร?

ตามที่กล่าวไว้ข้างต้น มีสองวิธีในการทำเช่นนี้: ขยายคลาสของเธรด หรือ ใช้อินเทอร์เฟซที่รันได้

คลาสเธรด

มีตัวสร้างและเมธอดในคลาส Thread ที่ให้คุณดำเนินการ จัดการ และติดตามเธรดได้ มันขยายคลาส Object ซึ่งใช้อินเทอร์เฟซ Runnable ที่แสดงร่วม ตัวสร้างที่มีอยู่ในคลาสเธรด ได้แก่ :Thread(), Thread(String name), Thread(Runnable r) และ Thread(Runnable r, String name)

ต่อไปนี้เป็นวิธีการและคำอธิบาย

วิธี ใช้ทำอะไร?
เริ่ม() เริ่มดำเนินการ
วิ่ง() เพื่อเรียกใช้การดำเนินการสำหรับเธรด
นอน() ทำให้เธรดเข้าสู่โหมดสลีปในช่วงเวลาที่กำหนด
เข้าร่วม() รอจนกว่าเธรดอื่นจะถูกยกเลิก
รับลำดับความสำคัญ () เพื่อแสดงลำดับความสำคัญของเธรดที่กำหนด
ตั้งค่าลำดับความสำคัญ() เพื่อเปลี่ยนลำดับความสำคัญของเธรดที่กำหนด
รับชื่อ () เพื่อส่งคืนชื่อเธรดที่เปิดเผย
ชื่อชุด () ในการเปลี่ยนชื่อเธรดที่ระบุ
getId() ในการส่งคืน ID ของเธรดที่กำหนด
isAlive() เพื่อทดสอบว่าเธรดยังคงมีอยู่ในสถานะใด ๆ หรือไม่?
ผลผลิต() หยุดการทำงานของเธรดออบเจกต์ชั่วคราวเพื่ออนุญาตให้เธรดอื่นรัน
ระงับ() เพื่อระงับเธรดที่กำหนด
ประวัติย่อ() เพื่อกลับสู่เธรดจากสถานะถูกระงับ
หยุด() เพื่อหยุดเธรดที่กำหนด
ทำลาย() เพื่อทำลายกลุ่มเธรดและกลุ่มย่อย
ขัดจังหวะ() เพื่อทำให้เกิดการหยุดชะงักในการดำเนินการเธรด
isinterrupted() เพื่อทดสอบว่าการประมวลผลเธรดที่กำหนดถูกขัดจังหวะหรือไม่
ขัดจังหวะ() เพื่อทดสอบว่าการประมวลผลเธรดปัจจุบันถูกขัดจังหวะหรือไม่
activeCount() วิธีคืนค่าจำนวนเธรดที่ใช้งานอยู่ในกลุ่มเธรด
ล็อคไว้() คืนค่า true ต่อเมื่อเธรดปัจจุบันมีการล็อกจอภาพบนอ็อบเจ็กต์ที่ระบุ
getState() เพื่อกำหนดสถานะของเธรดที่กำหนด
setContextClassLoader() ในการตั้งค่าบริบท ClassLoader
getContextClassLoader() เพื่อส่งคืนบริบท ClassLoader

ในการสร้างเธรดโดยการขยายคลาส Thread ขั้นแรกต้องสร้างคลาสที่ขยายคลาส java.lang.Thread คลาสนี้ถูกกำหนดให้แทนที่เมธอด run() ถัดไป วัตถุจะถูกสร้างขึ้นในคลาสใหม่ซึ่งตามมาด้วยการเรียกเมธอด start() เพื่อเริ่มการทำงานของเธรด

ต้องอ่าน: โปรแกรมรูปแบบใน Java ที่คุณควรชำระเงิน

อินเทอร์เฟซที่รันได้

นี่เป็นวิธีที่ง่ายที่สุดในการสร้างชุดข้อความ จำเป็นต้องใช้วิธีเดียวเท่านั้นในการปรับใช้ Runnable Interface: run()

เพื่อประกาศ เราเขียน

โมฆะสาธารณะ ()

Inside run( ) เราดำเนินการเขียนโค้ดเพื่อสร้างเธรดใหม่

ลงทะเบียนเรียน หลักสูตรวิศวกรรมซอฟต์แวร์ จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว

คลาสเธรดเทียบกับอินเทอร์เฟซที่รันได้

คลาสเธรดป้องกันไม่ให้คุณขยายคลาสอื่น นี่เป็นเพราะว่าการสืบทอดหลายรายการไม่สามารถทำได้ใน Java อย่างไรก็ตาม กรณีนี้ไม่ใช่กรณีที่เราใช้อินเทอร์เฟซ Runnable ซึ่งคุณยังคงขยายคลาสอื่นๆ ต่อไป

การขยายคลาสเธรดช่วยให้คุณเข้าถึงวิธีการที่สำคัญหลายอย่างได้ ซึ่งช่วยปรับปรุงการทำงานของเธรด ตัวอย่างเช่น Yield(), stop(), isalive(), interrupt() อินเทอร์เฟซ Runnable มีวิธีเดียวที่ค่อนข้างจำกัด

ห่อ

หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ Java การพัฒนาซอฟต์แวร์แบบฟูลสแตก โปรดดูโปรแกรม Executive PG ของ upGrad & IIIT-B ในการพัฒนาซอฟต์แวร์แบบครบวงจร ซึ่งออกแบบมาสำหรับมืออาชีพที่ทำงานและมีการฝึกอบรมที่เข้มงวดมากกว่า 500 ชั่วโมง 9+ โครงการและการมอบหมาย สถานะศิษย์เก่า IIIT-B โครงการหลักในทางปฏิบัติและความช่วยเหลือด้านงานกับบริษัทชั้นนำ

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

สมัครเลยตอนนี้สำหรับปริญญาโทด้านวิศวกรรมซอฟต์แวร์