Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa Thread và Runnable trong Java

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?

  1. Tuân thủ nguyên tắc "Composition over Inheritance" (Kết hợp thay vì kế thừa).
  2. Cho phép chia sẻ cùng một task instance giữa nhiều thread.
  3. Tương thích với ExecutorService, thread pool, lambda expression (Java 8+).
  4. Tránh giới hạn đơn kế thừa của Java.