จะสร้างเธรดใน Java ได้อย่างไร? | มัลติเธรดใน Java
เผยแพร่แล้ว: 2020-12-29ในบทความนี้ เราจะมาดูที่เธรดใน Java และสำรวจกลไกที่ทำให้เธรดเป็นไปได้
สารบัญ
เธรดใน Java
คุณลักษณะเธรดใน Java เป็นกระบวนการย่อยที่มีน้ำหนักเบา ถือว่าเป็นหน่วยการประมวลผลที่เล็กที่สุด เป็นวิธีการทำงานหลายอย่างพร้อมกันในโปรแกรม เป็นคุณสมบัติที่มีประโยชน์เมื่อพูดถึงเกม แอนิเมชั่น ฯลฯ
Java มีการสนับสนุนในตัวสำหรับการสร้างเธรดและมัลติเธรด นี่เป็นวิธีการที่ชาญฉลาดในการลดความไร้ประสิทธิภาพและการดึงข้อมูลโดยใช้พื้นที่ CPU ให้เกิดประโยชน์สูงสุด ใน Java สามารถทำได้สองวิธี:
- ขยายคลาสเธรดหรือ
- ใช้ Runnable Interface
เมื่อมีการดำเนินการมากกว่าหนึ่งเธรดพร้อมกัน เรียกว่ามัลติเธรด โดยพื้นฐานแล้วจะช่วยให้ส่วนต่างๆ ของโปรแกรมทำงานพร้อมกันได้ โดยแต่ละส่วนของเธรดและแต่ละเธรดจะดำเนินไปตามเส้นทางที่แตกต่างกันเพื่อดำเนินการ
เธรดใช้พื้นที่หน่วยความจำที่ใช้ร่วมกัน ไม่ได้จัดสรรหน่วยความจำให้แต่ละส่วน ส่งผลให้มีการใช้งาน CPU สูงสุด นอกจากนี้ การเปลี่ยนบริบทใช้เวลาไม่นาน อย่างไรก็ตาม เธรดจำนวนมากเกินไปอาจทำให้ CPU ของคุณมีส่วนร่วมกับการสลับบริบทและการดำเนินการของคุณอาจล่าช้า
เธรดสามารถมีอยู่ในหนึ่งในหกสถานะต่อไปนี้
- ใหม่ – ทันทีที่สร้างเธรด เธรดนั้นจะอยู่ในสถานะใหม่ โดยพื้นฐานแล้วหมายความว่าเธรดยังไม่เริ่มดำเนินการ
- กำลังทำงาน – เมื่อเธรดกำลังดำเนินการหรืออยู่ในบรรทัดที่จะดำเนินการ เธรดจะอยู่ในสถานะกำลังทำงาน
- กำลังรอ – เธรดที่กำลังรันอยู่บางครั้งถูกหยุดหรือระงับชั่วคราวเพื่อให้เกิดกิจกรรมอื่นขึ้น เวอร์ชันที่ไม่หมดเวลาของ wait() หรือ join() สามารถระงับเธรดไม่ให้ดำเนินการได้ เมื่อดำเนินการแล้ว เธรดที่ถูกระงับจะกลับมาทำงานต่อ
- TIMED-WAITING – เธรดที่กำลังรันอยู่บางครั้งอาจหยุดหรือระงับชั่วคราวในระยะเวลาที่กำหนด ตัวอย่างเช่น เมื่อเรียกใช้ฟังก์ชัน sleep()
- ถูกบล็อก – เมื่อเธรด Java ที่ถูกระงับไม่สามารถรับทรัพยากรใด ๆ ได้ เธรดนั้นจะถูกบล็อกและอยู่ในสถานะที่ถูกบล็อก
- TERMINATED – เมื่อเธรดเสร็จสิ้นการดำเนินการ เธรดจะอยู่ในสถานะสิ้นสุด อย่างไรก็ตาม คุณสามารถยุติเธรดเมื่อใดก็ได้
เรียนรู้เพิ่มเติมเกี่ยวกับสถาปัตยกรรมและส่วนประกอบ Java

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