Đề XuấT, 2020

Editor Choice

Sự khác biệt giữa Lớp luồng và Giao diện có thể chạy trong Java

Một chủ đề có thể được xác định theo hai cách. Đầu tiên, bằng cách mở rộng một lớp Thread đã triển khai giao diện Runnable. Thứ hai, bằng cách trực tiếp thực hiện giao diện Runnable . Khi bạn xác định một luồng bằng cách mở rộng lớp Thread, bạn phải ghi đè phương thức run () trong lớp Thread. Khi bạn xác định một luồng thực hiện giao diện Runnable, bạn phải thực hiện phương thức run () duy nhất của giao diện Runnable. Sự khác biệt cơ bản giữa Thread và Runnable là mỗi luồng được xác định bằng cách mở rộng lớp Thread tạo ra một đối tượng duy nhất và được liên kết với đối tượng đó. Mặt khác, mỗi luồng được xác định bằng cách triển khai giao diện Runnable chia sẻ cùng một đối tượng.

Hãy để chúng tôi quan sát một số khác biệt khác giữa Thread và Runnable với sự trợ giúp của biểu đồ so sánh được hiển thị bên dưới:

Biểu đồ so sánh

Cơ sở để so sánhChủ đềChạy được
Căn bảnMỗi luồng tạo ra một đối tượng duy nhất và được liên kết với nó.Nhiều chủ đề chia sẻ cùng một đối tượng.
Ký ứcKhi mỗi luồng tạo ra một đối tượng duy nhất, cần nhiều bộ nhớ hơn.Vì nhiều luồng chia sẻ cùng một đối tượng nên ít bộ nhớ được sử dụng.
Mở rộngDo đó, trong Java, nhiều kế thừa không được phép, sau khi một lớp mở rộng lớp Thread, nó không thể mở rộng bất kỳ lớp nào khác.Nếu một lớp xác định luồng thực hiện giao diện Runnable, nó có cơ hội mở rộng một lớp.
Sử dụngMột người dùng phải mở rộng lớp luồng chỉ khi nó muốn ghi đè các phương thức khác trong lớp Thread.Nếu bạn chỉ muốn chuyên về phương thức chạy thì thực hiện Runnable là một lựa chọn tốt hơn.
Khớp nốiMở rộng lớp Thread giới thiệu khớp nối chặt chẽ vì lớp chứa mã của lớp Thread và cũng là công việc được gán cho luồngViệc triển khai giao diện Runnable giới thiệu khớp nối lỏng lẻo vì mã của Thread là hình thức riêng biệt của công việc của Chủ đề.

Định nghĩa của lớp chủ đề

Chủ đề là một lớp trong gói java.lang . Lớp Thread mở rộng một lớp Object và nó thực hiện các giao diện Runnable . Lớp Thread có các hàm tạo và các phương thức để tạo và vận hành trên luồng. Khi chúng ta tạo nhiều luồng, mỗi luồng tạo một đối tượng duy nhất và được liên kết với đối tượng đó. Nếu bạn tạo một chủ đề mở rộng lớp Thread, hơn nữa bạn không thể mở rộng bất kỳ lớp nào khác vì java không hỗ trợ nhiều kế thừa. Vì vậy, bạn nên chọn chỉ mở rộng lớp Thread khi bạn cũng muốn ghi đè một số phương thức khác của lớp Thread. Chúng ta hãy xem một ví dụ về việc tạo một chủ đề mở rộng một lớp Thread.

 / * Xác định chủ đề * / Class Mythread mở rộng Chủ đề {/ * công việc của chủ đề * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Chủ đề con" ); }} Class mainThread {/ * công việc của luồng chính * / public static void main (String args []) {Mythread mt = new Mythread (); / * chủ đề chính đã tạo chủ đề con * / mt.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("Chủ đề chính"); }}} / * Đầu ra * / Chủ đề chính Chủ đề chính Chủ đề chính Chủ đề con Chủ đề con Chủ đề con Chủ đề con Chủ đề chính Chủ đề con Chủ đề chính Chủ đề chính Chủ đề con Chủ đề chính Chủ đề chính Chủ đề con Chủ đề chính 

Trong đoạn mã trên, tôi tạo một lớp Mythread mở rộng lớp Thread và ghi đè một phương thức chạy của lớp Thread. Trong lớp chứa phương thức chính, tôi tạo một đối tượng luồng (mt) của lớp Mythread và sử dụng đối tượng luồng đã gọi phương thức start (). Phương thức start bắt đầu thực thi luồng và đồng thời JVM gọi phương thức chạy của luồng. Bây giờ có hai luồng trong chương trình một luồng chính và luồng con thứ hai được tạo bởi luồng chính. Việc thực hiện cả hai luồng xảy ra đồng thời, nhưng, đầu ra chính xác không thể được giả vờ.

Định nghĩa giao diện Runnable

Runnable là một giao diện trong gói java.lang . Thực hiện giao diện Runnable chúng ta có thể xác định một chủ đề. Giao diện Runnable có một phương thức run (), được triển khai bởi lớp thực hiện giao diện Runnable. Khi bạn chọn xác định luồng thực hiện giao diện Runnable, bạn vẫn có lựa chọn mở rộng bất kỳ lớp nào khác. Khi bạn tạo nhiều luồng bằng cách triển khai giao diện Runnable, mỗi luồng chia sẻ cùng một thể hiện runnable. hãy cùng chúng tôi tìm hiểu cách xác định một luồng bằng giao diện Runnable.

 / * Xác định chủ đề * / Class Runnablethread thực hiện Runnable {/ * công việc của chủ đề * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Chủ đề con" ); }} Class mainThread {/ * công việc của luồng chính * / public static void main (String args []) {Mythread rt = new Mythread (); / * luồng chính đã tạo đối tượng runnable * / Thread t = new Thread (rt); / * luồng chính tạo luồng con và truyền đối tượng runnable * / t.start (); for (int i = 0; i <10; i ++) {System.Out.Print ("Chủ đề chính"); }}} / * Đầu ra * / Chủ đề chính Chủ đề chính Chủ đề chính Chủ đề con Chủ đề con Chủ đề con Chủ đề con Chủ đề chính Chủ đề con Chủ đề chính Chủ đề chính Chủ đề con Chủ đề chính Chủ đề chính Chủ đề con Chủ đề chính 

Trong đoạn mã trên, tôi đã tạo một lớp Runnablethread thực hiện giao diện Runnable và định nghĩa công việc của luồng bằng cách thực hiện phương thức run () của giao diện Runnable. Sau đó, tôi tạo một lớp duy trì có chứa phương thức chính. Bên trong phương thức chính, tôi đã khai báo một đối tượng có thể chạy được của lớp Runnablethread và truyền đối tượng này cho hàm tạo của Thread trong khi khai báo một luồng. Theo cách này, tôi đã liên kết đối tượng luồng (t) với một đối tượng có thể chạy được (rt). Sau đó, đối tượng luồng gọi phương thức bắt đầu của luồng mà tiếp tục gọi phương thức chạy của lớp Runnablethread. Nếu tôi không liên kết đối tượng runnable với đối tượng Thread, thì phương thức bắt đầu luồng sẽ gọi phương thức chạy của lớp Thread. Bây giờ, một lần nữa, có hai luồng trong mã, luồng chính và luồng chính tạo ra luồng con cả hai được thực thi đồng thời nhưng đầu ra chính xác không bao giờ có thể được giả vờ.

Sự khác biệt chính giữa luồng và Runnable trong Java

  1. Mỗi luồng được tạo bằng cách mở rộng lớp Thread tạo một đối tượng duy nhất cho nó và được liên kết với đối tượng đó. Mặt khác, mỗi luồng được tạo bằng cách thực hiện giao diện Runnable có chung thể hiện runnable.
  2. Vì mỗi luồng được liên kết với một đối tượng duy nhất khi được tạo bằng cách mở rộng lớp Thread, nên cần thêm bộ nhớ. Mặt khác, mỗi luồng được tạo bằng cách thực hiện giao diện Runnable chia sẻ cùng một không gian đối tượng, do đó, nó đòi hỏi ít bộ nhớ hơn.
  3. Nếu bạn mở rộng lớp Thread hơn nữa, bạn có thể kế thừa bất kỳ lớp nào khác vì Java không cho phép nhiều kế thừa trong khi đó, việc triển khai Runnable vẫn tạo cơ hội cho một lớp kế thừa bất kỳ lớp nào khác.
  4. Người ta phải mở rộng một lớp Thread chỉ khi nó phải ghi đè hoặc chuyên môn hóa một số phương thức khác của lớp Thread. Bạn phải triển khai giao diện Runnable nếu bạn chỉ muốn chuyên về phương thức chạy mà thôi.
  5. Mở rộng lớp Thread giới thiệu khớp nối chặt chẽ trong mã vì mã của Thread và công việc của luồng được chứa bởi cùng một lớp. Mặt khác, giao diện Runnable thực hiện giới thiệu khớp nối lỏng lẻo trong mã vì mã của Thread được tách biệt khỏi công việc được gán cho luồng.

Phần kết luận:

Được ưu tiên triển khai giao diện Runnable thay vì mở rộng lớp Thread. Khi triển khai Runnable làm cho mã của bạn được ghép lỏng lẻo vì mã của luồng khác với lớp gán công việc cho luồng. Nó đòi hỏi ít bộ nhớ hơn và cũng cho phép một lớp kế thừa bất kỳ lớp nào khác.

Top