การใช้งานเธรด
ใน Java วิธีการเรียกใช้หมายถึงงานที่จะเสร็จสิ้นสำหรับเธรด
1. สืบทอดคลาสเธรดและแทนที่วิธีการเรียกใช้ จากนั้นสร้างวัตถุของคลาสย่อยนี้และเรียกใช้วิธีการเริ่มต้น ()
2. กำหนดคลาสที่ใช้อินเตอร์เฟสที่ทำงานได้แล้วใช้วิธีการเรียกใช้ วัตถุของคลาสนี้ถูกส่งผ่านเป็นพารามิเตอร์เมื่อสร้างเธรดจากนั้นวิธีการเริ่มต้น () จะถูกเรียก
คลาสเธรดเป็นคลาสที่ใช้เป็นพิเศษเพื่อสร้างเธรดและทำงานบนเธรด เมื่อคลาสสืบทอดคลาสเธรดคลาสจะเรียกว่าคลาสเธรด
ทั้งสองวิธีต้องใช้วิธีการเริ่มต้น () ของเธรดเพื่อจัดสรรทรัพยากรระบบที่จำเป็นให้กับเธรดกำหนดเวลาเธรดให้เรียกใช้และดำเนินการวิธีการเรียกใช้ () ของเธรด
วิธีการเริ่มต้น () เป็นวิธีเดียวในการเริ่มต้นเธรด วิธีการเริ่มต้น () ก่อนเตรียมทรัพยากรระบบสำหรับการดำเนินการของเธรดแล้วเรียกใช้วิธีการเรียกใช้ () เธรดสามารถเริ่มต้นได้เพียงครั้งเดียวและมันผิดกฎหมายที่จะเริ่มต้นอีกครั้ง
งานของเธรดถูกนำไปใช้ในวิธีการเรียกใช้ () นั่นคือทุกสิ่งที่เราต้องการให้เธรดนี้ทำ โดยค่าเริ่มต้นวิธีการเรียกใช้ () ไม่ได้ทำอะไรเลย
ในแอปพลิเคชันเฉพาะวิธีใดในการสร้างเธรดขึ้นอยู่กับสถานการณ์ โดยทั่วไปเมื่อเธรดได้รับมรดกคลาสอื่นควรสร้างในวิธีที่สองนั่นคือการใช้อินเทอร์เฟซที่รันได้
นี่คือสองตัวอย่างเพื่อแสดงวิธีการใช้งานสองวิธีของเธรด
Public Class ThreadTest1 {Public Static Void Main (String [] args) {Thread1 Thread1 = Thread1 (); {@Override โมฆะสาธารณะ Run () {สำหรับ (int i = 0; i <100; ++ i) {system.out.println ("Hello World:" +i); โมฆะสาธารณะเรียกใช้ () {สำหรับ (int i = 0; i <100; ++ i) {system.out.println ("ยินดีต้อนรับ:" +i); ] args) {// วิธีการอื่นของการใช้งานเธรดยังสามารถใช้เธรดชั้นในไม่ระบุชื่อเธรด 1 = เธรดใหม่ (ใหม่ mythread1 ()); .Start ();}} คลาส MYTHREAD1 ใช้งาน Runnable {@Override public void run () {สำหรับ (int i = 0; i <100; ++ i) {system.out.println ("สวัสดี:" +i); }}} คลาส MyThread2 ใช้งาน Runnable {@Override public void run () {สำหรับ (int i = 0; i <100; ++ i) {system.out.println ("ยินดีต้อนรับ:" +i);
การวิเคราะห์ชั้นเรียน
คลาสเธรดยังใช้อินเทอร์เฟซที่รันได้ดังนั้นจึงใช้วิธีการเรียกใช้ () ในอินเทอร์เฟซ
เมื่อสร้างวัตถุเธรดหากไม่มีชื่อระบุชื่อของวัตถุเธรดจะอยู่ในรูปแบบของ: เธรด-หมายเลขซึ่งเป็นจำนวนที่เพิ่มขึ้นโดยอัตโนมัติและถูกแชร์โดยวัตถุเธรดทั้งหมดเพราะเป็นสมาชิกคงที่ ตัวแปร
เมื่อใช้วิธีแรก (วิธีการสืบทอดเธรด) เพื่อสร้างวัตถุเธรดเราจำเป็นต้องแทนที่วิธีการเรียกใช้ () เนื่องจากวิธีการเรียกใช้ () ของคลาสเธรดไม่ได้ทำอะไรในเวลานี้
เมื่อใช้วิธีที่สอง (วิธีการใช้งานอินเตอร์เฟส Runnable) เพื่อสร้างวัตถุเธรดเราจำเป็นต้องใช้วิธีการเรียกใช้ () ของอินเทอร์เฟซ Runnable จากนั้นใช้เธรดใหม่ (ใหม่ MyRunnableClass ()) เพื่อสร้างวัตถุเธรด (MyRunnableClass ได้ใช้งาน Runnable) ในเวลานี้วิธีการเรียกใช้ () ของวัตถุเธรดจะเรียกวิธีการเรียกใช้ () ของ MyrunnableClass
หยุดด้าย
การตายของเธรดไม่สามารถทำได้โดยเรียกคำสั่ง STOP () แต่ให้วิธีการเรียกใช้ () สิ้นสุดตามธรรมชาติ วิธีการหยุด () ไม่ปลอดภัยและถูกทอดทิ้ง
วิธีที่แนะนำในการหยุดเธรด: ตั้งค่าตัวแปรธงซึ่งเป็นลูปในวิธีการเรียกใช้ ()
ดังที่แสดงในตัวอย่างรหัส:
Public Class ControlThreadTest {MyThreadClass R = ใหม่ MyThreadClass (); MythreadClass ดำเนินการ {private boolean flag = true;
วงจรชีวิตของด้ายและวงจรชีวิตลำดับความสำคัญ
วงจรชีวิตด้าย: กระบวนการจากการสร้างจนถึงการตายของเธรด
รูปต่อไปนี้แสดงสถานะต่าง ๆ ในวงจรชีวิตด้าย:
วงจรชีวิตของด้ายสามารถแบ่งออกเป็นสี่รัฐ:
1. สร้างสถานะ:
เมื่อวัตถุเธรดใหม่ถูกสร้างขึ้นด้วยตัวดำเนินการใหม่เธรดจะอยู่ในสถานะที่สร้างขึ้น
เธรดในสถานะที่สร้างขึ้นเป็นเพียงวัตถุเธรดที่ว่างเปล่าและระบบไม่ได้จัดสรรทรัพยากรให้
2. สถานะที่รันได้:
วิธีการเริ่มต้น () ของเธรดการดำเนินการจะจัดสรรทรัพยากรระบบที่จำเป็นให้กับเธรดจัดเรียงการทำงานและเรียกใช้เมธอด Thread - Run () เพื่อให้เธรดอยู่ในสถานะ runnable (runnable)
สถานะนี้ไม่ใช่สถานะที่กำลังทำงานอยู่เพราะเธรดอาจไม่ทำงานจริง
3. ไม่เรียกใช้สถานะ:
เมื่อเหตุการณ์ต่อไปนี้เกิดขึ้นเธรดในสถานะการทำงานจะถูกถ่ายโอนไปยังสถานะที่ไม่สามารถทำได้:
วิธีการนอนหลับ () เรียกว่า;
เธรดเรียกวิธีการรอ () เพื่อรอเงื่อนไขเฉพาะที่จะพึงพอใจ;
การปิดกั้นอินพุต/เอาต์พุตของเธรด
กลับไปที่สถานะที่รันได้:
เธรดในสถานะการนอนหลับได้ผ่านไปหลังจากเวลาที่กำหนด;
หากเธรดกำลังรอเงื่อนไขที่แน่นอนวัตถุอื่นจะต้องแจ้งให้ทราบถึงสภาพเธรดที่รอการเปลี่ยนแปลงผ่านวิธีการแจ้งเตือน () หรือ notifyall ();
หากเธรดถูกบล็อกเนื่องจากอินพุตและเอาต์พุตให้รออินพุตและเอาต์พุตให้เสร็จสมบูรณ์
4. สถานะความตาย:
เมื่อมีการดำเนินการเมธอดของเธรด () เธรดเธรดจะตายตามธรรมชาติ
ลำดับความสำคัญของเธรด
1. ลำดับความสำคัญและการตั้งค่าของเธรด
ลำดับความสำคัญของเธรดคือการอำนวยความสะดวกในการกำหนดเวลาของระบบของเธรดในสภาพแวดล้อมแบบมัลติเธรดและเธรดที่มีลำดับความสำคัญสูงจะถูกดำเนินการก่อน
การตั้งค่าลำดับความสำคัญของเธรดเป็นไปตามหลักการต่อไปนี้:
เมื่อมีการสร้างเธรดเด็กจะสืบทอดลำดับความสำคัญของผู้ปกครอง
หลังจากสร้างเธรดแล้วลำดับความสำคัญสามารถเปลี่ยนแปลงได้โดยเรียกใช้เมธอด setPriority ()
ลำดับความสำคัญของเธรดเป็นจำนวนเต็มบวกระหว่าง 1-10
1- min_priority
10-max_priority
5-norm_priority
หากไม่มีการตั้งค่าไม่มีค่าเริ่มต้นคือ 5
อย่างไรก็ตามลำดับความสำคัญของเธรดไม่สามารถกำหนดได้โดยลำดับการดำเนินการของเธรด
2. กลยุทธ์การกำหนดเวลาเธรด
ตัวกำหนดเวลาเธรดเลือกเธรดที่มีลำดับความสำคัญสูงสุดในการรัน อย่างไรก็ตามหากเกิดขึ้นต่อไปนี้เธรดจะถูกยกเลิก:
วิธีการให้ผลผลิต () เรียกว่าในตัวเธรดให้เลิกอาชีพ CPU
วิธีการนอนหลับ () ถูกเรียกในตัวกระทู้เพื่อให้ด้ายหลับ
เธรดถูกบล็อกเนื่องจากการดำเนินการ I/O
เธรดอื่นที่มีลำดับความสำคัญสูงกว่าจะปรากฏขึ้น
ในระบบที่รองรับชิ้นเวลาชิ้นเวลาของเธรดจะหมดลง