เข้าใจหัวข้อ
แนวคิด
เธรดคือเธรดการดำเนินการในโปรแกรม เครื่องเสมือน Java ช่วยให้แอปพลิเคชันสามารถเรียกใช้เธรดการดำเนินการหลายรายการพร้อมกัน
คุณสมบัติเธรด
มีสถานะซึ่งแสดงถึงสถานะของเธรด ในเวลาเดียวกันเธรดใน JVM มีสถานะเดียวเท่านั้น
·ใหม่
เธรดที่ยังไม่ได้เริ่มต้น (เธรดที่ยังไม่ได้เริ่มตั้งแต่เริ่มต้นของโปรแกรม)
・ runnable
เธรดที่รันได้ที่ทำงานอยู่ใน JVM แต่อาจรอทรัพยากรอื่น ๆ เช่น CPU
・ บล็อก
การปิดกั้นเธรดรอล็อคเพื่อให้มันทำงานต่อไป
·ซึ่งรอคอย
Infinite Wait (เรียกใช้อีกครั้งในเธรดที่ต้องอาศัยการให้มันเข้าสู่สถานะนั้นเพื่อดำเนินการเฉพาะ)
・ timed_waiting
การรอกำหนดเวลา (เรียกใช้อีกครั้งในเธรดที่อาศัยการปล่อยให้มันป้อนสถานะนั้นสำหรับการดำเนินการเฉพาะภายในเวลารอที่กำหนด)
・ ยกเลิก
ออกจากเธรด
มีลำดับความสำคัญและกำหนดลำดับการดำเนินการของเธรด
จำนวนเต็มระหว่าง 1 ถึง 10 ค่าเริ่มต้นคือ 5 ยิ่งมีค่าที่สูงขึ้นโอกาสในการดำเนินการที่สูงขึ้นและลำดับความสำคัญไม่ได้กำหนดลำดับการดำเนินการของเธรด
ลำดับความสำคัญของเธรดลูกนั้นเหมือนกับเธรดพาเรนต์โดยค่าเริ่มต้น
โปรดทราบว่า JVM จะหยุดดำเนินการเธรดทั้งหมดเมื่อ:
วิธีการทางออก () ของรันไทม์ (รันไทม์) ถูกเรียกและการโทรของวิธีการอนุญาตโดยผู้จัดการรักษาความปลอดภัย;
"เธรดที่ไม่ใช่ Daemon" ทั้งหมดหยุดทำงาน (ไม่ว่าพวกเขาจะหยุดตามปกติหรือหยุด);
สามารถทำเครื่องหมายเป็น daemon (daemon)
ด้ายลูกของด้ายดุลยังคงเป็นด้าย daemon;
เธรด Daemon ยังเป็น "เธรดแบ็กเอนด์" ซึ่งโดยทั่วไปจะใช้ในการรันงานพื้นหลังในขณะที่เธรดผู้ใช้โดยทั่วไปจะดำเนินงานระดับผู้ใช้
วิธีการยุติเธรด
1. ใช้ธงทางออกเพื่อให้ออกจากเธรดตามปกตินั่นคือเธรดจะสิ้นสุดลงหลังจากวิธีการเรียกใช้เสร็จสมบูรณ์
เมื่อใช้วิธีการเรียกใช้เธรดจะออก แต่บางครั้งวิธีการวิ่งก็ไม่สิ้นสุด ตัวอย่างเช่นการใช้เธรดเพื่อฟังคำขอไคลเอนต์ในโปรแกรมเซิร์ฟเวอร์หรืองานอื่น ๆ ที่ต้องใช้การประมวลผลแบบวนซ้ำ ในกรณีนี้งานเหล่านี้มักจะอยู่ในลูปเช่นขณะวนรอบ หากคุณต้องการให้ลูปทำงานตลอดไปคุณสามารถใช้ในขณะที่ (จริง) {... } เพื่อจัดการกับมัน อย่างไรก็ตามหากคุณต้องการที่จะออกไปในขณะที่ลูปออกภายใต้เงื่อนไขที่แน่นอนวิธีที่ตรงที่สุดคือการตั้งค่าธงประเภทบูลีนและควบคุมว่าในขณะที่ลูปออกโดยการตั้งค่าสถานะนี้เป็นจริงหรือเท็จ นี่คือตัวอย่างของการยกเลิกเธรดโดยใช้ธงทางออก
flagexitthread.java
แพ็คเกจ com.rainmonth;/*** สร้างโดย randyzhang เมื่อ 2017/3/23.*/คลาสสาธารณะ flagexitThread ขยายเธรด {บูลีนระเหยสาธารณะบูลีน isexit = false; flagexitthread สาธารณะ (ชื่อสตริง) {super (ชื่อ);democlient.java
แพ็คเกจ com.rainmonth;/*** สร้างโดย randyzhang เมื่อ 2017/3/23.*/คลาสสาธารณะ democlient {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {system.out.println ("อินสแตนซ์ขั้วต่อของขั้ว"); exitbyflag (); ใหม่ flagexitthread (flagexitthread.class.getSimplename ()); flagexitthread.start (); ลอง {thread.sleep (1000); flagexitthread.isexit = true; flagexitthread.join (); system.out.out.println ( {E.PrintStackTrace ();}} โมฆะคงที่ส่วนตัว exitByInterrupt () {flagexitThread flagexitThread = flagexitThread ใหม่ (flagexitthread.class.getSimplename (); system.out.out.println ("flagexitthread ... "); {thread.sleep (1500); system.out.println ("flagexitthread ขัดจังหวะ ... "); flagexitthread.interrupt (); thread.sleep (1500); system.out.println ("หยุดแอปพลิเคชัน ... ");} catch (interruptedexception e)ผลลัพธ์ผลลัพธ์:
พิมพ์พวงของฉันกำลังวิ่งหลังจากออกจากเธรด
2. ใช้วิธีการหยุดเพื่อยุติเธรด (ไม่แนะนำวิธีนี้เนื่องจากการหยุดนั้นเหมือนกับการระงับและดำเนินการต่อและอาจมีผลลัพธ์ที่คาดเดาไม่ได้)
แสดงวิธีการโทรหยุด () คำอธิบายของ Stop () ในซอร์สโค้ดมีดังนี้:
/** วิธีนี้ไม่ปลอดภัยโดยเนื้อแท้ การหยุดเธรดด้วย* thread.stop ทำให้มันปลดล็อคจอภาพทั้งหมดว่ามัน* ล็อค (เป็นผลที่ตามมาตามธรรมชาติของข้อยกเว้น* <code> threaddeath </code> ที่ไม่ถูกตรวจสอบ หาก* วัตถุใด ๆ ที่ได้รับการปกป้องก่อนหน้านี้โดยจอภาพเหล่านี้อยู่ในสถานะที่ไม่สอดคล้องกันวัตถุที่เสียหายจะปรากฏให้เห็นถึง* เธรดอื่น ๆ ซึ่งอาจส่งผลให้เกิดพฤติกรรมโดยพลการ การใช้งานจำนวนมากของ <code> หยุด </code> ควรถูกแทนที่ด้วยรหัสที่เพียงแค่แก้ไขตัวแปรบางอย่างเพื่อระบุว่าเธรดเป้าหมายควรหยุดทำงาน เธรดเป้าหมายควรตรวจสอบตัวแปรนี้* เป็นประจำและกลับจากวิธีการเรียกใช้ในแฟชั่นที่เป็นระเบียบ* หากตัวแปรระบุว่าจะหยุดทำงาน หากเธรด* เป้าหมายรอเป็นระยะเวลานาน (บนตัวแปรเงื่อนไข* ตัวอย่างเช่น) ควรใช้วิธี <code> interrupt </code> เพื่อขัดจังหวะการรอ*/////
ความหมายทั่วไปคือความไม่มั่นคงของวิธีการนั้นมีอยู่ การโทรหยุด () เพื่อยุติเธรดจะปล่อยมอนิเตอร์ทั้งหมดที่ล็อคไว้ (ซึ่งจะทำให้เกิดข้อยกเว้นด้ายที่แพร่กระจายขึ้นไปตามสแต็กที่จะตรวจสอบให้ถูกโยน) หากมีความไม่สอดคล้องกันในวัตถุก่อนหน้านี้ได้รับการปกป้องโดยจอภาพที่ปล่อยออกมาเหล่านี้และวัตถุเหล่านี้สามารถมองเห็นได้ในเธรดอื่น ๆ สิ่งนี้จะนำไปสู่ผลที่ไม่คาดคิดบางอย่าง สิ่งที่ควรหยุดการดำเนินการจะถูกแทนที่ด้วยรหัสที่จำเป็นต้องแก้ไขรหัสบางอย่างเพื่อระบุว่าเธรดเป้าหมายควรหยุดทำงาน (วิธีที่ 1 เป็นวิธีนี้) หากเธรดเป้าหมายรอเงื่อนไขที่แน่นอน (เช่นตัวแปรเงื่อนไขบางอย่าง) เป็นเวลานานเราควรใช้วิธีการขัดจังหวะเพื่อขัดจังหวะการรอ (นี่คือวิธีการของวิธีที่ 3)
3. ใช้วิธีการขัดจังหวะเพื่อขัดจังหวะเธรด
อินเตอร์รัปต์หมายถึงการยกเลิกอย่างแท้จริง แต่อย่าพยายามยุติเธรดโดยการโทรขัดจังหวะเพราะบางครั้งแม้ว่าคุณจะเรียกวิธีการเธรดจะดำเนินการต่อไป คุณสามารถแสดงความคิดเห็นออก ExitByFlag () ด้านบนเปิดใช้งานวิธี ExitByInterrupt () และพบว่าวิธีการขัดจังหวะ () ถูกเรียกในเวลาและฉันกำลังใช้งาน ... (ผลลัพธ์ของระบบที่แตกต่างกันและซีพียูอาจแตกต่างกัน) จะเห็นได้ว่ามันไม่ปลอดภัยที่จะใช้วิธีการขัดจังหวะ
สรุป
จากการวิเคราะห์ข้างต้นวิธีที่แนะนำมากที่สุดคือวิธีแรก เราสามารถตั้งค่าสถานะโดยใช้ตัวแปรที่ใช้ร่วมกันและส่งสัญญาณเพื่อแจ้งเธรดว่าต้องยกเลิก แน่นอนเราต้องตรวจสอบให้แน่ใจว่าการดำเนินงานของตัวแปรที่ใช้ร่วมกันนี้เป็นแบบซิงโครนัส
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับอินสแตนซ์ของเธรดการเลิกจ้าง Java และการอ่านซอร์สโค้ดเมธอดหยุด () ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!