ความแตกต่างระหว่างการนอนหลับกับการรอในภาษาจาวา

สารบัญ:

ความแตกต่างระหว่างการนอนหลับกับการรอในภาษาจาวา
ความแตกต่างระหว่างการนอนหลับกับการรอในภาษาจาวา

วีดีโอ: ความแตกต่างระหว่างการนอนหลับกับการรอในภาษาจาวา

วีดีโอ: ความแตกต่างระหว่างการนอนหลับกับการรอในภาษาจาวา
วีดีโอ: Java Loop : J101 การเขียนคำสั่งทำซ้ำ ในภาษา JAVA 2024, กรกฎาคม
Anonim

Key Difference – sleep vs wait ใน Java

นอนและรอเป็นสองวิธีที่ใช้สำหรับมัลติเธรดใน Java เมธอด sleep เป็นของคลาส Thread ในขณะที่เมธอด wait มาจากคลาส Object ความแตกต่างที่สำคัญระหว่างสลีปและการรอใน Java คือ สลีปถูกใช้เพื่อระงับการดำเนินการของเธรดปัจจุบันตามจำนวนมิลลิวินาทีที่ระบุ ในขณะที่เมธอด wait ถูกใช้เพื่อทำให้เธรดปัจจุบันรอจนกว่าเธรดอื่นจะเรียกใช้การแจ้งเตือนหรือ notifyAll วิธีสำหรับวัตถุ

เธรดเป็นหน่วยการประมวลผลที่เล็กที่สุดในระบบปฏิบัติการ เป็นลำดับขั้นตอนเดียวของการควบคุมภายในโปรแกรมเส้นด้ายมีน้ำหนักเบา มัลติเธรดเป็นกลไกของการรันหลายเธรดพร้อมกัน ภาษาการเขียนโปรแกรมเช่น Java รองรับมัลติเธรด มัลติเธรดมีข้อดีเพราะช่วยให้สามารถรันหลายเธรดพร้อมกันและเธรดนั้นแยกจากกัน มีเมธอดใน Java ที่สามารถใช้สำหรับมัลติเธรดได้ สองคนนอนรอ

การนอนใน Java คืออะไร

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

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

มีหลายวิธีในคลาสเธรดเพื่อทำงานต่างๆวิธีการนอนหลับใช้เพื่อการนอนหลับตามระยะเวลาที่กำหนด ไวยากรณ์สำหรับวิธีสลีปคือโมฆะสลีปสาธารณะ (มิลลิวินาทีแบบยาว) พ่น InterruptedException ทำให้เธรดที่กำลังดำเนินการอยู่หยุดการดำเนินการชั่วคราวตามจำนวนมิลลิวินาทีที่ระบุ หากเธรดอื่นขัดจังหวะเธรดปัจจุบัน สถานะที่ถูกขัดจังหวะของเธรดปัจจุบันจะถูกล้างเมื่อมีการยกเว้นนี้

ความแตกต่างระหว่างการนอนหลับและการรอใน Java
ความแตกต่างระหว่างการนอนหลับและการรอใน Java

รูปที่ 01: โปรแกรม Java พร้อมวิธีการพักเครื่อง

ตามโปรแกรมด้านบน วิธีรันประกอบด้วยโค้ดที่ควรรัน ในโปรแกรมหลัก สองอ็อบเจ็กต์ของ ExampleThread1 จะถูกสร้างขึ้น และมีการเรียกใช้เมธอดเริ่มต้น ที่จะอนุญาตให้เรียกใช้รหัสภายในวิธีการเรียกใช้ เธรดเดียวเท่านั้นที่ทำงานในแต่ละครั้ง ด้วยด้าย.นอนหลับ (1,000); จะอนุญาตให้เธรดแรกยุติการดำเนินการเป็นเวลา 1,000 มิลลิวินาที เมื่อเธรดอยู่ในโหมดสลีป ตัวกำหนดเวลาเธรดจะดึงเธรดอื่น

Java รออะไรอยู่

หลายเธรดอาจเข้าถึงทรัพยากรที่แชร์ อาจทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง การซิงโครไนซ์เธรดสามารถใช้เพื่อสร้างเธรดเดียวเท่านั้นเพื่อเข้าถึงทรัพยากรที่ใช้ร่วมกัน ให้สมมติสถานการณ์ดังนี้ หากมีสองเธรดเช่น t1 และ t2 t1 ให้เริ่มบันทึกค่าลงในไฟล์ข้อความที่เรียกว่า Text1.txt ค่าเหล่านั้นจะถูกใช้สำหรับการคำนวณอื่นๆ เมื่อ t1 ส่งคืน ถ้า t2 เริ่มต้นก่อน t1 กลับมา t2 สามารถเปลี่ยนค่าที่ t1 บันทึกไว้ได้ ซึ่งอาจทำให้ t1 ให้เอาต์พุตที่ไม่ถูกต้อง ด้วยความช่วยเหลือของการซิงโครไนซ์ เมื่อ t1 เริ่มใช้ไฟล์ Text1.txt ไฟล์นั้นสามารถล็อคได้ ดังนั้น t1 เท่านั้นจึงจะสามารถเข้าถึงได้ t2 ไม่สามารถเปลี่ยนแปลงได้จนกว่า t1 จะปลดล็อคเพื่อเข้าถึงไฟล์ข้อความนั้น เมื่องานเสร็จสิ้น t1 สามารถปลดล็อคได้ ล็อคเรียกอีกอย่างว่าจอภาพ

การซิงโครไนซ์เธรดสามารถทำได้โดยการสื่อสารระหว่างเธรด ส่วนที่สำคัญคือส่วนรหัสที่เข้าถึงทรัพยากรที่ใช้ร่วมกัน ในการสื่อสารระหว่างเธรด เธรดจะหยุดทำงานชั่วคราวในส่วนที่สำคัญ และเธรดอื่นได้รับอนุญาตให้เข้าสู่ส่วนสำคัญเดียวกันเพื่อดำเนินการ มีการใช้งานโดยใช้วิธี wait, notify และ notifyAll พวกเขาอยู่ในคลาส Object เมธอด wait ใช้เพื่ออนุญาตให้เธรดปัจจุบันปลดล็อคและรอจนกว่าเธรดอื่นจะเรียกใช้เมธอด notify หรือ notifyAll สำหรับอ็อบเจ็กต์ วิธีการแจ้งใช้เพื่อปลุกเธรดเดียวที่กำลังรอการล็อก notifyAll ปลุกเธรดทั้งหมดที่กำลังรอการล็อก

ความแตกต่างระหว่างโหมดสลีปกับการรอใน Java_Figure 02
ความแตกต่างระหว่างโหมดสลีปกับการรอใน Java_Figure 02

รูปที่ 02: ชั้นเรียนเครื่องคิดเลข

ความแตกต่างที่สำคัญระหว่างการนอนหลับและการรอใน Java
ความแตกต่างที่สำคัญระหว่างการนอนหลับและการรอใน Java

รูปที่ 03: วิธีหลัก

วิชาเครื่องคิดเลขขยายหัวข้อ บล็อกที่ซิงโครไนซ์อยู่ในวิธีการเรียกใช้ วิธี for loop และ notify อยู่ในบล็อกที่ซิงโครไนซ์ ภายในเมธอดหลัก อินสแตนซ์ของเธรดที่สร้างและเมธอดเริ่มต้นถูกเรียกบนอินสแตนซ์นั้น วิธีหลักจะรอจนกว่าเธรดจะแจ้งเตือน เมื่อรันโปรแกรม เมธอดหลักจะรอจนถึงการดำเนินการทั้งหมดของเมธอด run และรอเมธอด notify เมื่อเรียกใช้เมธอด notify แล้ว เมธอดหลักจะหยุดรอและเริ่มรันโค้ดที่เหลือ หลักกำลังรอจนกว่าเธรดเครื่องคิดเลขจะเสร็จสิ้น สุดท้ายผลรวมจะถูกพิมพ์

ถ้าไม่มีบล็อกที่ซิงโครไนซ์และถ้าวิธีหลักมีโค้ดตามด้านล่างนี้ จะให้ผลลัพธ์เป็นศูนย์เพราะไม่รอให้เธรดอื่นทำงานให้เสร็จ

เครื่องคิดเลข t1=เครื่องคิดเลขใหม่ ();

t1. เริ่ม ();

System.out.println (t1.sum);

ความคล้ายคลึงกันระหว่าง sleep และ wait ใน Java คืออะไร

ทั้งโหมดสลีปและการรอเป็นวิธีที่สามารถใช้ได้เมื่อใช้งานมัลติเธรดใน Java

การนอนกับการรอในภาษา Java แตกต่างกันอย่างไร

นอนกับรอในจาวา

วิธีสลีปทำให้เธรดปัจจุบันหยุดการทำงานชั่วคราวตามจำนวนมิลลิวินาทีที่ระบุ ขึ้นอยู่กับความแม่นยำและความถูกต้องของตัวจับเวลาและตัวกำหนดตารางเวลาของระบบ วิธีการรอทำให้เธรดปัจจุบันรอจนกว่าเธรดอื่นจะเรียกใช้เมธอด notify หรือ notifyAll สำหรับออบเจกต์
สมาคมกับล็อค
วิธีสลีปไม่ปลดล็อควัตถุในระหว่างการซิงโครไนซ์ วิธีการรอจะปลดล็อคระหว่างการซิงโครไนซ์
วิธีดำเนินการ
วิธีสลีปถูกดำเนินการในเธรดปัจจุบัน วิธีการรอถูกเรียกบนวัตถุ
ชั้นเรียนที่เกี่ยวข้อง
การนอนหลับเป็นวิธีการเรียนของเธรด การรอคอยเป็นวิธีการของคลาส Object
เสร็จ
การนอนจะเสร็จสิ้นเมื่อหมดเวลาที่กำหนด วิธีการรอถูกขัดจังหวะโดยโทรแจ้งหรือแจ้งทุกวิธี

สรุป – นอน vs รอใน Java

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