CodeGym /หลักสูตรจาวา /โมดูล 2: Java Core /เธรดหยุด: เวอร์ชันอย่างเป็นทางการ

เธรดหยุด: เวอร์ชันอย่างเป็นทางการ

โมดูล 2: Java Core
ระดับ , บทเรียน
มีอยู่

"สวัสดี Amigo! คุณต้องยอมรับว่าความคิดยกเลิกของ Ellie นั้นยอดเยี่ยมมาก"

"ใช่."

"อันที่จริง มีสิ่งที่คล้ายกันอยู่ใน คลาส เธรดเฉพาะตัวแปรเท่านั้นที่ไม่ได้เรียกว่าisCancelมันเรียกว่าisInterruptและวิธีการที่ใช้ในการหยุดเธรดไม่ได้cancel()มันคืออินเตอร์รัปต์() "

"จริงหรือ?"

"ใช่ ลองดูสิ:"

รหัส คำอธิบาย
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
เนื่องจากหลายเธรดสามารถเรียกใช้เมธอด run บนออบเจกต์ Clock เดียวกันเราจึงได้รับอ็อบเจกต์เธรดสำหรับเธรดปัจจุบัน

คลาส Clock เขียนคำว่า "Tick" ลงในคอนโซลวินาทีละครั้ง ตราบเท่าที่ ตัวแปร isInterrupt ของเธรดปัจจุบัน เป็นเท็จ

เมื่อisInterruptกลายเป็นtrue วิธี การรัน  จะสิ้นสุดลง

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
เธรดหลักเริ่มต้นเธรดย่อย (นาฬิกา) ที่ควรทำงานตลอดไป

รอ 10 วินาทีและ ยกเลิกงานโดยเรียกวิธีการขัดจังหวะ

เธรดหลักเสร็จสิ้นการทำงาน

เธรดนาฬิกาสิ้นสุดการทำงาน

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

"ทำไมต้องโยนข้อยกเว้น จะดีกว่าไหมถ้าใส่ isInterrupted() แทน isCancel() ในลูป"

" อย่างแรกเมธอดrunไม่มีการวนซ้ำเสมอ เมธอดอาจประกอบด้วยการเรียกใช้เมธอดอื่นๆ สองสามโหล จากนั้นคุณจะต้องเพิ่มการตรวจสอบ isInterrupted ก่อนเรียกเมธอดแต่ละครั้ง"

" ประการที่สองวิธีการบางอย่างที่เกี่ยวข้องกับการดำเนินการต่างๆ มากมาย อาจใช้เวลานานมากในการดำเนินการ"

" ประการที่สามการโยนข้อยกเว้นไม่ได้แทนที่การตรวจสอบ isInterrupted เป็นเพียงการเพิ่มเติมที่สะดวก ข้อยกเว้นที่ส่งกลับทำให้คุณสามารถคลาย call stack กลับไปยังวิธีการเรียกใช้ได้ อย่างรวดเร็ว "

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

" ประการที่ห้าการตรวจสอบเพิ่มเติมไม่ได้ทำให้ประสิทธิภาพลดลง การเรียกใช้เมธอด sleep หมายความว่าเธรดไม่ควรทำอะไรเลย (ยกเว้นโหมดสลีป) ดังนั้นงานพิเศษจะไม่รบกวนใคร"

"นั่นเป็นข้อโต้แย้งที่ร้ายแรง"

"และสุดท้ายมีสิ่งนี้: วิธีการรันของคุณสามารถเรียกรหัสของคนอื่นได้—รหัสที่คุณไม่มีสิทธิ์เข้าถึง (ซอร์สโค้ดและ/หรือสิทธิ์ในการเปลี่ยนแปลงรหัส) อาจไม่มีการตรวจสอบ isInterrupted และอาจใช้ " ลอง ... จับ (ข้อยกเว้น e) " เพื่อจับข้อยกเว้นทั้งหมด"

ไม่มีใครรับประกันได้ว่าเธรดจะหยุดทำงาน ด้ายเท่านั้นที่จะหยุดตัวเองได้

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION