"สวัสดี Amigo! Ellie บอกคุณเกี่ยวกับชุดข้อความ และฉันจะบอกคุณว่าคุณทำงานกับพวกเขาอย่างไร หากต้องการสร้างชุดข้อความใหม่ คุณต้อง:"

1)  สร้างวัตถุเธรด

2)ผ่านวิธีการที่คุณต้องการเรียกใช้

3)  เรียกวิธีการเริ่มต้นบนวัตถุเธรดที่สร้างขึ้น

พิจารณาตัวอย่างนี้:

รหัส คำอธิบาย
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
คลาสที่ใช้อินเทอร์เฟซที่รันได้
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 สร้างอินสแตนซ์ของคลาส Printer ซึ่งใช้วิธีการเรียกใช้
2 สร้างวัตถุเธรดใหม่ เราส่งตัวสร้างไปยังวัตถุเครื่องพิมพ์ซึ่งจำเป็นต้องเรียกใช้เมธอด run()
3 เริ่มเธรดใหม่โดยเรียกเมธอดstart()

โปรแกรม Java ขนาดเล็กมักจะประกอบด้วยหนึ่งเธรดที่เรียกว่า «เธรดหลัก» แต่โปรแกรมมักจะเปิดเธรดเพิ่มเติมซึ่งเรียกว่า «เธรดลูก» เธรดหลักรันเมธอดหลักและสิ้นสุด วิธีการเรียกใช้Runnableเป็นวิธีการแบบอะนาล็อกสำหรับเธรดลูก

"อา เธรดจำนวนมากหมายถึงวิธีการหลักมากมาย"

การสร้างและเริ่มต้นเธรดใหม่ - 1

ในการบอกออบเจกต์เธรดว่าควรเริ่มเมธอดใด เราจำเป็นต้องส่งผ่านเมธอดไปให้ ใน Java สิ่งนี้ทำได้โดยใช้อินเทอร์เฟซที่รันได้ อินเทอร์เฟซ นี้มีวิธีการนามธรรมเดียว: void run() คลาสเธรดมีคอนสตรัคเตอร์เธรด (รันได้ รันได้) คุณสามารถส่งผ่านวัตถุใดๆ ที่ใช้อินเทอร์เฟซที่เรียกใช้ได้

คลาสของคุณต้องสืบทอดRunnableและแทนที่วิธีการรัน ของมัน การเรียกใช้วิธีนี้คือสิ่งที่เริ่มต้นเธรดใหม่ คุณสามารถเขียนสิ่งที่คุณต้องการในวิธีการเรียกใช้

รหัส คำอธิบาย
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
คลาสที่ใช้อินเทอร์เฟซที่รันได้
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Jack");
Thread thread2 = new Thread(printer2);
thread2.start();
}
สร้างเธรดสองเธรด ซึ่งแต่ละเธรดจะขึ้นอยู่กับวัตถุเครื่องพิมพ์ของตัวเอง
public static void main(String[] args)
{
Printer printer = new Printer("Natasha");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
สร้างสามเธรดตามวัตถุเครื่องพิมพ์เดียว

ยิ่งไปกว่านั้น คุณสามารถรวมทั้งหมดนี้เป็นคลาสเดียวได้ คลาสเธรดสืบทอดอินเทอร์เฟซที่รันได้ดังนั้นคุณจะต้องแทนที่เมธอดการรันของมัน เท่านั้น:

อีกวิธีในการสร้างเธรดใหม่
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
สืบทอด คลาส เธรดซึ่งใช้ อินเทอร์เฟซ ที่เรียกใช้ได้แล้วแทนที่วิธีการเรียกใช้
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

Printer printer2 = new Printer("Jack");
printer2.start();

}
สร้างเธรดสองเธรด ซึ่งแต่ละเธรดจะขึ้นอยู่กับวัตถุเครื่องพิมพ์ ของตัวเอง

"นี่เป็นวิธีแก้ปัญหาที่หรูหรากว่า"

"ใช่ แต่มันก็มีข้อบกพร่อง:"

1)  คุณอาจต้องเริ่มเธรดหลายเธรดโดยอิงจากอ็อบเจกต์เดียว ดังตัวอย่างกับนาตาชา

2)  หากคุณสืบทอดจากคลาสเธรด คุณไม่สามารถเพิ่มคลาสพาเรนต์อื่นในคลาสของคุณได้

3)  หากคลาสของคุณมีคลาสพาเรนต์ คุณไม่สามารถเพิ่มเธรดเป็นคลาสพาเรนต์ที่สองได้

"อีกนัยหนึ่ง หลังจากที่เมธอด start ถูกเรียก แต่ละเธรดจะเริ่มดำเนินการเมธอด run ของอ็อบเจกต์ที่ส่งผ่านไปยังคอนสตรัคเตอร์"

"ใช่ หากไม่มีการส่งผ่านไปยังคอนสตรัคเตอร์ เธรดก็จะรันเมธอดการรันภายใน"

“แต่ทำไมเราไม่เรียกเมธอดแบบนี้ล่ะ”

รหัส
public static void main(String[] args)
{
 Printer printer1 = new Printer("Nick");
 printer1.run();
}

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

"เข้าใจแล้ว คุณสามารถเรียกวิธีอื่นที่ไม่ใช่ run ได้ไหม"

"ไม่ ทุกอย่างเชื่อมโยงกับอินเทอร์เฟซ Runnable ซึ่ง "รู้" เกี่ยวกับวิธีใดวิธีหนึ่งเท่านั้น: run() "