"Xin chào, Amigo! Ellie đã nói với bạn về các chủ đề và tôi sẽ cho bạn biết cách bạn làm việc với chúng. Để tạo một chủ đề mới, bạn cần phải:"

1)  Tạo đối tượng Chủ đề

2) Truyền cho phương thức bạn muốn chạy

3)  Gọi phương thức bắt đầu trên đối tượng Thread đã tạo.

Hãy xem xét ví dụ này:

Mã số Sự miêu tả
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
Lớp triển khai giao diện Runnable .
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 Tạo một thể hiện của lớp Máy in, thực hiện phương thức chạy.
2 Tạo một đối tượng Thread mới. Chúng tôi chuyển hàm tạo đối tượng máy in, phương thức run() của nó cần được gọi.
3 Bắt đầu luồng mới bằng cách gọi phương thức start() .

Các chương trình Java nhỏ thường bao gồm một luồng được gọi là «luồng chính». Nhưng các chương trình thường khởi chạy các luồng bổ sung, được gọi là «luồng con». Luồng chính chạy phương thức chính và kết thúc. Phương thức chạy của Runnable là phương thức tương tự cho các luồng con.

"À, nhiều chủ đề có nghĩa là nhiều phương pháp chính."

Tạo và bắt đầu chủ đề mới - 1

Để báo cho một đối tượng Thread phương thức cụ thể mà nó sẽ bắt đầu, bằng cách nào đó chúng ta cần truyền một phương thức cho nó. Trong Java, điều này được thực hiện bằng giao diện Runnable . Giao diện này chứa một phương thức trừu tượng duy nhất: void run() . Lớp Thread có hàm tạo Thread(Runnable Runnable) . Bạn có thể chuyển vào bất kỳ đối tượng nào triển khai giao diện Runnable .

Lớp của bạn phải kế thừa Runnable và ghi đè phương thức chạy của nó . Gọi phương thức này là những gì bắt đầu chủ đề mới. Bạn có thể viết bất cứ điều gì bạn muốn trong phương thức chạy .

Mã số Sự miêu tả
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Lớp triển khai giao diện Runnable.
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();
}
Tạo hai luồng, mỗi luồng sẽ dựa trên đối tượng Máy in của chính nó.
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();
}
Tạo ba luồng dựa trên một đối tượng Máy in duy nhất.

Hơn nữa, bạn có thể kết hợp tất cả những thứ này vào một lớp. Lớp Thread kế thừa giao diện Runnable , vì vậy bạn chỉ cần ghi đè phương thức chạy của nó :

Một cách khác để tạo chủ đề mới
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Kế thừa lớp Thread , lớp này triển khai giao diện Runnable , sau đó ghi đè phương thức chạy .
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

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

}
Tạo hai luồng, mỗi luồng sẽ dựa trên đối tượng Máy in của chính nó .

"Đây là một giải pháp tao nhã hơn."

"Vâng, nhưng nó có những thiếu sót của nó:"

1)  Bạn có thể cần bắt đầu một số luồng dựa trên một đối tượng, như trong ví dụ với Natasha.

2)  Nếu bạn kế thừa từ lớp Thread, bạn không thể thêm lớp cha khác vào lớp của mình.

3)  Nếu lớp của bạn có lớp cha, bạn không thể thêm Thread làm lớp cha thứ hai.

"Nói cách khác, sau khi phương thức bắt đầu được gọi, mỗi luồng bắt đầu thực thi phương thức chạy của đối tượng được truyền cho hàm tạo?"

"Có. Nếu không có gì được chuyển đến hàm tạo, thì Chủ đề chỉ thực thi phương thức chạy bên trong của nó."

"Nhưng tại sao chúng ta không gọi phương thức này như thế này?"

Mã số
public static void main(String[] args)
{
 Printer printer1 = new Printer("Nick");
 printer1.run();
}

"Khi luồng chính đến phương thức chạy , "rô bốt nhỏ" của nó chỉ cần đi vào bên trong và thực hiện tất cả các lệnh bên trong nó. Chỉ sau khi chúng được thực thi, nó mới quay trở lại phương thức chính và tiếp tục thực hiện các lệnh tiếp theo. Do đó, không có giây phút nào " robot nhỏ" sẽ được tạo ra. Tất cả công việc sẽ được thực hiện tuần tự, không song song (đồng thời)."

"Tôi hiểu. Bạn có thể gọi một số phương pháp khác, một cái gì đó khác hơn là chạy?"

"Không. Tất cả đều gắn liền với giao diện Runnable, giao diện này chỉ "biết" về một trong các phương thức của nó: run() ."