Java cung cấp hai cách tạo thread thực thi: kế thừa class Thread hoặc triển khai interface Runnable.
Bảng so sánh chi tiết
| STT | Tiêu chí | Thread (class) | Runnable (interface) |
|---|---|---|---|
| 1 | Bản chất | Là một class, dùng để tạo thread | Là functional interface (Java 8+), dùng để định nghĩa task |
| 2 | Phương thức | Nhiều phương thức: start(), run(), sleep(), join()... |
Chỉ có phương thức trừu tượng run() |
| 3 | Đối tượng & Thread | Mỗi thread tạo một đối tượng duy nhất gắn liền | Nhiều thread có thể chia sẻ cùng một đối tượng Runnable |
| 4 | Bộ nhớ | Tốn nhiều bộ nhớ hơn (kế thừa toàn bộ Thread) | Tốn ít bộ nhớ hơn (chỉ implement interface) |
| 5 | Hạn chế kế thừa | Java không hỗ trợ đa kế thừa → sau extends Thread không thể extends class khác |
Class vẫn có thể extends class khác đồng thời implements Runnable |
Ví dụ Runnable (Khuyến nghị)
class RunnableExample implements Runnable {
public void run() {
System.out.println("Thread đang chạy qua Runnable");
}
public static void main(String[] args) {
RunnableExample task = new RunnableExample();
Thread t1 = new Thread(task);
t1.start();
}
}
Ví dụ Thread (Kế thừa)
class ThreadExample extends Thread {
public void run() {
System.out.println("Thread đang chạy qua extends Thread");
}
public static void main(String[] args) {
ThreadExample t1 = new ThreadExample();
t1.start();
}
}
Tại sao nên ưu tiên Runnable?
- Tuân thủ nguyên tắc "Composition over Inheritance" (Kết hợp thay vì kế thừa).
- Cho phép chia sẻ cùng một task instance giữa nhiều thread.
- Tương thích với
ExecutorService, thread pool, lambda expression (Java 8+). - Tránh giới hạn đơn kế thừa của Java.