เมื่อเธรดถูกสร้างขึ้นและเริ่มต้นมันจะไม่เข้าสู่สถานะการดำเนินการทันทีที่เริ่มต้นและไม่อยู่ในสถานะการดำเนินการเสมอ ในช่วงวงจรชีวิตของมันจะต้องผ่านห้ารัฐ: "ใหม่", "runnable", "วิ่ง", "บล็อก" และ "ตาย" หลังจากสร้างเธรดมันเป็นไปไม่ได้ที่จะครอบครอง CPU และทำงานอย่างอิสระ จำเป็นต้องสลับระหว่างหลายเธรดดังนั้นจึงถูกสลับระหว่างการทำงานและการปิดกั้นเวลาส่วนใหญ่
1. สถานะของเธรด
มีหลายสถานะที่แตกต่างกันของการดำรงอยู่ของเธรดดังต่อไปนี้:
1. สถานะใหม่
สถานะใหม่เป็นสถานะที่มีการสร้างเธรด แต่ยังไม่เริ่มทำงาน สถานะนี้อนุญาตให้เธรดทำงานได้โดยเรียกใช้วิธีการเริ่มต้น () ของเธรด
2. สถานะ Runnable
สถานะที่เรียกใช้สามารถเรียกได้ว่าสถานะการเตรียมการหรือคิว สถานะนี้สามารถอนุญาตให้เธรดทำงานได้โดยเรียกใช้วิธีการเริ่มต้น () ของเธรด
ตัวกำหนดตารางเวลาเธรดกำหนดเธรดที่จะเรียกใช้และระยะเวลาที่เธรดจะทำงาน
3. สถานะการทำงาน
หากเธรดกำลังดำเนินการอยู่ในสถานะกำลังทำงาน
4. สถานะตาย
เมื่อเธรดเข้าสู่สถานะตายมันจะไม่สามารถทำงานได้อีกต่อไป
5. สถานะที่ไม่สามารถเรียกใช้งานได้
Java Virtual Machine JVM ดำเนินการเธรดตามลำดับความสำคัญของเธรดและหลักการกำหนดเวลา
2. THREAD SCHEDULER
ใน JVM การใช้งานตัวกำหนดตารางเวลาของเธรดมักจะขึ้นอยู่กับสองกลยุทธ์ต่อไปนี้:
กลยุทธ์การกำหนดเวลาการกำหนดเวลาไว้ล่วงหน้ากลยุทธ์การกำหนดเวลาการกำหนดเวลาหรือกลยุทธ์การกำหนดเวลารอบโรบิน
การใช้งานตัวกำหนดตารางเวลาเธรดนั้นไม่ขึ้นอยู่กับแพลตฟอร์มดังนั้นการกำหนดเวลาของเธรดจึงไม่สามารถคาดการณ์ได้
3. ลำดับความสำคัญของเธรด
JVM กำหนดลำดับความสำคัญให้กับเธรดที่สร้างขึ้นใหม่แต่ละรายการ
ระดับ 0: นี่คือลำดับความสำคัญต่ำสุด
ระดับ 5: นี่เป็นลำดับความสำคัญปกติ
ระดับ 10: นี่คือลำดับความสำคัญสูงสุด
เพื่อบันทึกค่าเหล่านี้คลาสเธรดมีตัวแปรสามตัวที่สอดคล้องกัน:
เธรดจะสืบทอดลำดับความสำคัญของเธรดหลักก่อน ลำดับความสำคัญเริ่มต้นของแต่ละเธรดคือระดับ 5 (ลำดับความสำคัญปกติ) และลำดับความสำคัญเริ่มต้นของเธรดหลักคือระดับ 5
ลำดับความสำคัญของเธรดสามารถตั้งค่าผ่านวิธี setPriority (ลำดับความสำคัญ int)
Public Void SetPriority (Int Priority)
โมฆะสาธารณะ getPriority ();
เธรดที่ผู้ใช้กำหนดมีหมายเลขเธรดเริ่มต้น+ หมายเลขลำดับและหมายเลขลำดับเริ่มต้นจาก 0 เช่นเธรดแรกคือเธรด 0
ชื่อเธรดสามารถตั้งค่าผ่านเมธอด setName (ชื่อสตริง) และชื่อเธรดสามารถรับได้โดยใช้เมธอด getName ()
Public Final Void setName (ชื่อสตริง)
Public Final String getName ()
ตัวอย่าง
มาดูตัวอย่างด้านล่าง:
แพ็คเกจ demo.ch; คลาสสาธารณะ userThread ขยายเธรด {userThread () {super (); } userThread (ชื่อสตริง) {super (ชื่อ); } โมฆะสาธารณะเรียกใช้ () {system.out.println ("เธรดเริ่มทำงาน .. "); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {userThread Thread1 = ใหม่ userThread ("thread1"); UserThread Thread2 = ใหม่ userThread ("thread2"); System.out.println ("เธรด 1 ชื่อเริ่มต้นและลำดับความสำคัญ"); System.out.println ("ชื่อ:" + thread1.getName ()); System.out.println ("ลำดับความสำคัญ:" + thread1.getPriority ()); System.out.println ("เธรด 2 ชื่อเริ่มต้นและลำดับความสำคัญ"); System.out.println ("ชื่อ:" + thread2.getPriority ()); System.out.println ("ลำดับความสำคัญ:" + thread2.getPriority ()); System.out.println (""); Thread1.SetPriority (6); Thread2.setPriority (9); System.out.println ("เธรด 1 ชื่อเริ่มต้นและลำดับความสำคัญ"); System.out.println ("ชื่อ:" + thread1.getName ()); System.out.println ("ลำดับความสำคัญ:" + thread1.getPriority ()); System.out.println ("เธรด 2 ชื่อเริ่มต้นและลำดับความสำคัญ"); System.out.println ("ชื่อ:" + thread2.getName ()); System.out.println ("ลำดับความสำคัญ:" + thread2.getPriority ()); System.out.println (""); Thread1.start (); Thread2.start (); สำหรับ (int i = 0; i <5; i ++) system.out.println ("วิธีการหลัก I ค่า:"+i); -ผลลัพธ์ผลลัพธ์:
เธรด 1 ชื่อเริ่มต้นและชื่อลำดับความสำคัญ: Thread1Priority: 5 ทุ่งหญ้า 2 ชื่อเริ่มต้นและชื่อลำดับความสำคัญ: Thread2Priority: 5Thread 1 ชื่อเริ่มต้นและชื่อลำดับความสำคัญ: Thread1Priority: 6 ทริก 2 ชื่อเริ่มต้นและชื่อลำดับความสำคัญ: Thread2Priority: 9Main วิธีการ
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!