Phân biệt Runable interface và Thread abstract class

Chào mừng các bạn đã trở lại với thachleblog. Ở bài trước mình đã giới về lợi ích của việc sử dụng multi thread trong Java. Để tạo 1 thread trong Java ta có 2 cách đó là implements Runnable interface hoặc extends Thread class. Bài viết hôm nay mình sẽ trình bày sự khác biệt giữa Runnable và Thread.

Giới thiệu

Điểm khác biệt giữa Runnable và Thread đó là Runnable là interface, Thread là abstract class. Sự khác biệt giữa abstract class và interface mình đã có 1 bài phân tích, các bạn có thể tham khảo thêm tại đây
Do đó, có sự khác biệt trong việc tạo thread bằng Runnable và Thread.

Để tạo thread bằng cách implements Runnable interface, ta thực hiện các bước:

  • Implements Runnable interface, override run() method
  • Tạo Thread object với parameter là Runnable implementation
  • Gọi start() method

Để tạo thread bằng cách extends Thread class, ta thực hiện các bước:

  • Extends Thread class, override run() method
  • Tạo thread object
  • Gọi start() method

phan biet runnable va thead class

Hình minh họa cách tạo một thread (nguồn internet)

Ví dụ

Ví dụ về tạo thread bằng extends Thread

  1. package thach.le.runnableandthread;
  2. public class ExtendThread extends Thread {
  3. @Override
  4. public void run() {
  5. System.out.println("I am extending Thread");
  6. }
  7. }

Ví dụ về tạo thread bằng implement Runable

  1. package thach.le.runnableandthread;
  2. public class ImplementRunnable implements Runnable {
  3. @Override
  4. public void run() {
  5. System.out.println("I am implementing the Runnable");
  6. }
  7. }

Tạo thread

  1. package thach.le.runnableandthread;
  2. public class TestRunnableAndThread {
  3. public static void main(String args[]) throws Exception {
  4. // Create a thread implement Runnable
  5. ImplementRunnable implementRunnable = new ImplementRunnable();
  6. Thread thread = new Thread(implementRunnable);
  7. thread.start();
  8.  
  9. // Creating a thread extend Thread
  10. ExtendThread extendThread = new ExtendThread();
  11. extendThread.start();
  12. }
  13. }

Vậy khi nào nên tạo thread bằng cách implements Runnable interface, và khi nào nên tạo thread bằng cách extends Thread class?

Chúng ta cùng phân tích lợi ích khi implements interface Runnable:

  • Nếu chúng ta implements interface Runnable, chúng ta vẫn có thể extends 1 class khác, nếu chúng ta extends Thread class chúng ta sẽ không thể extends thêm bất kì class nào vì Java không hỗ trợ đa kế thừa
  • Khi một class implements Runnable, ta nói class có khả năng “Runnable” hay còn gọi là mối quan hệ has – a, class extends Thread ta gọi class đó là “Thread” hay còn gọi mối quan hệ is – a. Trong thiết kế hướng đối tượng, thường dùng kế thừa has – a vì giúp giảm sự phụ thuộc code, code sẽ dễ test và maintain hơn.
  • Extends Thread có nghĩa là class chúng ta sẽ được kế thừa tất cả các method của Thread class, đôi khi không cần thiết, gây lãng phí bộ nhớ khi tạo thread.

Vậy khi nào ta tạo thread bằng cách extends Thread class?

Chỉ khi nào ta cần override và sử dụng các method của Thread class. Các trường hợp chỉ cần tạo thread để chạy, ta nên implements Runnable.

Bài viết của mình đến đây là hết, hẹn gặp lại các bạn ở các bài viết sau. Hy vọng bài viết giúp các bạn hiểu hơn về multi thread và có thể cân nhắc lựa chọn Runnable hoặc Thread khi apply multi thread vào trong project của mình. Rất mong nhận được đóng góp ý kiến đóng góp của tất cả các bạn.

Xin cảm ơn.

Tham khảo thêm:
http://javahungry.blogspot.com/2015/05/implements-runnable-vs-extends-thread-in-java-example.html
https://www.tutorialspoint.com//java/java_multithreading.htm

8 thoughts on “Phân biệt Runable interface và Thread abstract class

  1. Nếu đã chỉ cách tạo 1 thread và start như thế nào, nên include thêm cách để stop nó lun 😀 bài viết ngắn gọn hay, nhưng thêm tí detail để more useful với người đọc

    • My intend just show the different of Runable and Thead. Because there is different from create a thread and same on using. But anyway, thank for your opinion, I will consider to update.

  2. Pingback: Thread interference trong Java – Java technologies

  3. Pingback: Thread interference trong Java » Thach Le

  4. Anh cho em hỏi, hình như thằng Runnable interface nó ít phương thức hơn Thread phải không ạ. Không có setName, getName, setPriority…..Thanks

Tham gia bình luận