"สวัสดี Amigo! Ellie บอกคุณเกี่ยวกับชุดข้อความ และฉันจะบอกคุณว่าคุณทำงานกับพวกเขาอย่างไร หากต้องการสร้างชุดข้อความใหม่ คุณต้อง:"
1) สร้างวัตถุเธรด
2)ผ่านวิธีการที่คุณต้องการเรียกใช้
3) เรียกวิธีการเริ่มต้นบนวัตถุเธรดที่สร้างขึ้น
พิจารณาตัวอย่างนี้:
รหัส | คำอธิบาย |
---|---|
|
คลาสที่ใช้อินเทอร์เฟซที่รันได้ |
|
1 สร้างอินสแตนซ์ของคลาส Printer ซึ่งใช้วิธีการเรียกใช้ 2 สร้างวัตถุเธรดใหม่ เราส่งตัวสร้างไปยังวัตถุเครื่องพิมพ์ซึ่งจำเป็นต้องเรียกใช้เมธอด run() 3 เริ่มเธรดใหม่โดยเรียกเมธอดstart() |
โปรแกรม Java ขนาดเล็กมักจะประกอบด้วยหนึ่งเธรดที่เรียกว่า «เธรดหลัก» แต่โปรแกรมมักจะเปิดเธรดเพิ่มเติมซึ่งเรียกว่า «เธรดลูก» เธรดหลักรันเมธอดหลักและสิ้นสุด วิธีการเรียกใช้Runnableเป็นวิธีการแบบอะนาล็อกสำหรับเธรดลูก
"อา เธรดจำนวนมากหมายถึงวิธีการหลักมากมาย"

ในการบอกออบเจกต์เธรดว่าควรเริ่มเมธอดใด เราจำเป็นต้องส่งผ่านเมธอดไปให้ ใน Java สิ่งนี้ทำได้โดยใช้อินเทอร์เฟซที่รันได้ อินเทอร์เฟซ นี้มีวิธีการนามธรรมเดียว: void run() คลาสเธรดมีคอนสตรัคเตอร์เธรด (รันได้ รันได้) คุณสามารถส่งผ่านวัตถุใดๆ ที่ใช้อินเทอร์เฟซที่เรียกใช้ได้
คลาสของคุณต้องสืบทอดRunnableและแทนที่วิธีการรัน ของมัน การเรียกใช้วิธีนี้คือสิ่งที่เริ่มต้นเธรดใหม่ คุณสามารถเขียนสิ่งที่คุณต้องการในวิธีการเรียกใช้
รหัส | คำอธิบาย |
---|---|
|
คลาสที่ใช้อินเทอร์เฟซที่รันได้ |
|
สร้างเธรดสองเธรด ซึ่งแต่ละเธรดจะขึ้นอยู่กับวัตถุเครื่องพิมพ์ของตัวเอง |
|
สร้างสามเธรดตามวัตถุเครื่องพิมพ์เดียว |
ยิ่งไปกว่านั้น คุณสามารถรวมทั้งหมดนี้เป็นคลาสเดียวได้ คลาสเธรดสืบทอดอินเทอร์เฟซที่รันได้ดังนั้นคุณจะต้องแทนที่เมธอดการรันของมัน เท่านั้น:
อีกวิธีในการสร้างเธรดใหม่ | |
---|---|
|
สืบทอด คลาส เธรดซึ่งใช้ อินเทอร์เฟซ ที่เรียกใช้ได้แล้วแทนที่วิธีการเรียกใช้ |
|
สร้างเธรดสองเธรด ซึ่งแต่ละเธรดจะขึ้นอยู่กับวัตถุเครื่องพิมพ์ ของตัวเอง |
"นี่เป็นวิธีแก้ปัญหาที่หรูหรากว่า"
"ใช่ แต่มันก็มีข้อบกพร่อง:"
1) คุณอาจต้องเริ่มเธรดหลายเธรดโดยอิงจากอ็อบเจกต์เดียว ดังตัวอย่างกับนาตาชา
2) หากคุณสืบทอดจากคลาสเธรด คุณไม่สามารถเพิ่มคลาสพาเรนต์อื่นในคลาสของคุณได้
3) หากคลาสของคุณมีคลาสพาเรนต์ คุณไม่สามารถเพิ่มเธรดเป็นคลาสพาเรนต์ที่สองได้
"อีกนัยหนึ่ง หลังจากที่เมธอด start ถูกเรียก แต่ละเธรดจะเริ่มดำเนินการเมธอด run ของอ็อบเจกต์ที่ส่งผ่านไปยังคอนสตรัคเตอร์"
"ใช่ หากไม่มีการส่งผ่านไปยังคอนสตรัคเตอร์ เธรดก็จะรันเมธอดการรันภายใน"
“แต่ทำไมเราไม่เรียกเมธอดแบบนี้ล่ะ”
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
printer1.run();
}
"เมื่อเธรดหลักมาถึงเมธอดรัน"หุ่นยนต์ตัวน้อย"ของมันก็จะเข้าไปข้างในและดำเนินการคำสั่งทั้งหมดภายในนั้น หลังจากดำเนินการแล้วเท่านั้น มันจะกลับไปที่เมธอดหลักและดำเนินการคำสั่งเพิ่มเติมต่อไป ดังนั้นจึงไม่มีวินาที" หุ่นยนต์ตัวน้อย"จะถูกสร้างขึ้น งานทั้งหมดจะดำเนินการตามลำดับ ไม่ใช่แบบขนาน (พร้อมกัน)"
"เข้าใจแล้ว คุณสามารถเรียกวิธีอื่นที่ไม่ใช่ run ได้ไหม"
"ไม่ ทุกอย่างเชื่อมโยงกับอินเทอร์เฟซ Runnable ซึ่ง "รู้" เกี่ยวกับวิธีใดวิธีหนึ่งเท่านั้น: run() "
GO TO FULL VERSION